Использование read.csv для rowSums с пробелами в R

Я работаю в R с данными, импортированными из CSV-файла, и я пытаюсь взять rowSum подмножества моих данных. Данные могут быть 0, 1 или пустыми. Я хотел бы взять сумму всех 1 во всех этих строках (и в идеале найти количество непустых столбцов в каждой строке, но это моя следующая проблема). Я пытаюсь следующий код:

df1 <- read.csv("/Users/ardyn/test.csv", header = T, na.strings = "")

rowSums(df1[,36:135])

Что дает мне следующую ошибку:

Msgstr "Ошибка в rowSums(df1[, 36:135]): 'x' должно быть числовым".

Когда я проверяю, столбцы, которые я пытаюсь суммировать, представляют собой факторы с 3 уровнями (".","0","1").

Как мне импортировать данные или изменить мою команду rowSums, чтобы, когда я беру сумму по подмножеству переменных, она просто считала 1 с?

2 ответа

Решение

Только цифры и NA может быть обработан rowSums(), Если это работает, попробуйте установить na.strings=".",
Иначе мы можем заменить все . с NA после прочтения csv.

df1 <- read.csv("/Users/ardyn/test.csv", header = TRUE, 
  na.strings = ".", stringsAsFactors=FALSE)

rowSums(df1[,36:135], na.rm=TRUE)

Пример изменения . в NA пост факт:

dtf <- as.data.frame(matrix(sample(c(".", "0", "1"), 20, replace=TRUE), 4))

sapply(dtf, function(x) as.numeric(gsub("\\.", "NA", x)))

#      V1 V2 V3 V4 V5
# [1,]  1  0  0  0  1
# [2,]  1  1  0  0  0
# [3,]  1  1 NA  1 NA
# [4,] NA NA  1  0  0

Я не уверен, что предыдущий ответ решил проблему, в которой вы хотели бы сложить только 1. Так что, возможно, это то, что вы можете сделать

df1 <- read.csv("/Users/ardyn/test.csv", header = TRUE, na.strings = ".",stringsAsFactors=FALSE)

myfun <- function(x) {
if (x==1) {
    return (as.numeric(x))
          }
else {
    return (0L)
      }
}
rowSums(apply(df1,c(1,2),myfun))

Я думаю, что это должно прекратить бросать 'х', должна быть числовая ошибка

Другие вопросы по тегам