2015-09-01 34 views
1

这很令人沮丧,因为它觉得它应该如此简单,但它吸干了几个小时。R:1列或更多列的行数

我想获得数据框中列的列表的行总和,但该列表(由用户设置)可能非常好,长度为1即列号。

rowSums不允许求和1列。

rowsum使用我发现完全不可解码的组。我已经玩了很多年的例子,但仍然不知道它的用途,但它不能被忽略。

最上面的答案here使用rowSumsapply;第二个使用.SDlapply,但使用:=.SD以及其他没有出现在R帮助中的术语,也没有见过,这只是另一个搜索和混淆的虫洞。

所以说:有什么我可以使用:

x <- matrix(runif(100), ncol = 5) 
goodcols <- c(1,3,5) 
y <- rowSums(x[,goodcols]) 

,将用1或> 1 goodcols工作?

在此先感谢。我目前考虑使用:

ifelse(length(goodcols)>1, 
y<-rowSums(x[,goodcols]), 
y<-x[,goodcols]) 
+3

只是用'下降= FALSE'避免X被改变当只有一列时,将其转换为向量。 '.SD'和':='是包'data.table'的语法。最后一件事,把'y < - rowSums(x [,goodcols])'而不是'y < - rowSums [,goodcols]',这应该会更好;-)(所以你需要的是'y < - rowSums( x [,goodcols,drop = F])) – Cath

回答

4

当你只有留在data.framematrix,或array一列,R它强制转换为vector。要保持尺寸,您需要使用参数drop

逻辑:
Drop由下式定义(你可以在help("[.data.frame")读取)。如果为TRUE,则结果被强制为可能的最小尺寸。如果只留下一列,则默认为放弃,但如果只剩下一行,则不放弃。

所以,你的情况,你需要,如果你想rowSums工作无论列数是使用下面的代码:

y <- rowSums(x[, goodcols, drop = FALSE])