2

我正在使用从 csv 文件导入的数据在 R 中工作,并且我正在尝试获取我的数据子集的 rowSum。数据可以是 0、1 或空白。我想对所有这些行中的所有 1 求和(理想情况下,计算每行中有多少非空白列,但这是我的下一个问题)。我正在尝试以下代码:

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

rowSums(df1[,36:135])

这给了我以下错误:

“rowSums(df1[, 36:135]) 中的错误:‘x’必须是数字”。

当我检查时,我试图求和的列是具有 3 个级别的因子(“.”、“0”、“1”)。

如何导入数据或更改我的 rowSums 命令,以便当我对变量子集求和时,它只计算 1?

4

2 回答 2

2

只有数字并且NA可以被处理rowSums()。如果有效,请尝试设置na.strings=".".
否则,我们可以在阅读 csv 后全部.替换为。NA

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
于 2017-12-06T18:06:12.253 回答
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))

我认为它应该停止抛出“x”必须是数字错误

于 2017-12-06T19:27:46.237 回答