【问题标题】:R: Row sums for 1 or more columnsR:1 列或多列的行总和
【发布时间】:2015-09-01 11:48:09
【问题描述】:

这令人沮丧,因为感觉它应该如此简单,但它会占用几个小时。

我想获取数据框中列列表的行总和,但该列表(由用户设置)很可能是长度 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])

【问题讨论】:

  • 只要使用drop=FALSE 就可以避免x 在只有一列时变成向量。 .SD:= 是来自包 data.table 的语法。最后一件事,用y &lt;- rowSums(x[,goodcols]) 代替y &lt;- rowSums[,goodcols],这样会更好;-)(所以你需要的是y &lt;- rowSums(x[, goodcols, drop=F])

标签: r rowsum


【解决方案1】:

data.framematrixarray 中只剩下一列时,R 会将其强制转换为 vector。要保留尺寸,您需要使用参数drop
Drop 由以下人员定义(您可以在help("[.data.frame") 中阅读):

合乎逻辑。如果为 TRUE,则结果被强制转换为可能的最低维度。默认是只剩下一列就删除,如果只剩下一行则不删除。

因此,在您的情况下,如果您希望 rowSums 无论列数是多少,都需要使用以下代码:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 2021-01-28
    • 2016-07-30
    相关资源
    最近更新 更多