与 Excel 中的 sumif 函数等效的简洁 R 代码 - 特别适用于数据框行
Posted
技术标签:
【中文标题】与 Excel 中的 sumif 函数等效的简洁 R 代码 - 特别适用于数据框行【英文标题】:Concise R code equivalent to the sumif function in Excel - particularly applied over data frame rows 【发布时间】:2017-07-11 20:09:58 【问题描述】:我需要从数据框中的列子集中选择性地跨行添加值。值可以取整数 0、1、2 或 3。2 和 3 的总和(不是 2 和 3 的计数,这很容易)给出了我们正在测量的“强度”。假设我的数据框有 60 列长,我只想查看第 2 到第 11 列。实现这一点(一种方式)的 excel 代码非常简单:=sumif(a2:a11,">1")
。这将添加该范围内的所有 2 和 3。
虽然我过去曾使用过aggregate()
,但有关此主题的大多数答案并不是真正想做我想做的事情,而且我无法找到让aggregate()
发挥作用的方法我需要的方式。我也对试图让rowSums()
这样做感到困惑。
最终我意识到我可以做到以下几点:
apply(data[,2:11], 1, function(x)sum(2*(x==2), 3*(x==3), na.rm=T))
这是迄今为止我发现的最快和最优雅的复制我的特定期望行为的方法,相当于 Excel 的sumif
。
如果有人有更好的方法,我会很高兴听到。
【问题讨论】:
sum_row_if
from expss
package: sum_row_if(gt(1), df[, 2:11])
披露:我是包作者。
非常有帮助,谢谢 Gregory。
【参考方案1】:
#DATA
set.seed(42)
df = data.frame(matrix(sample(0:3, 250, replace = TRUE), ncol = 50))
下面是使用rowSums()
的方法
rowSums(df[,2:11] * (df[,2:11] > 1), na.rm = TRUE)
#[1] 18 13 11 19 11
与您的解决方案比较
apply(df[,2:11], 1, function(x) sum(2*(x==2), 3*(x==3), na.rm=TRUE))
#[1] 18 13 11 19 11
【讨论】:
啊,这样更好。本质上是相同的方法(从逻辑的角度来看),但代码更简单。太好了,谢谢。【参考方案2】:一个建议:
apply(data[,2:11], 1, function(x) sum(x[x %in% 2:3], na.rm = TRUE))
【讨论】:
啊,很有用。 %in% 可能是我最喜欢的数据工作运算符。不知道这个用法。谢谢!以上是关于与 Excel 中的 sumif 函数等效的简洁 R 代码 - 特别适用于数据框行的主要内容,如果未能解决你的问题,请参考以下文章
MySQL与EXCEL sum sumif sumifs 函数结合_品牌汇总_20161101
(紧急)关于excel中的SUMIF函数在实际应用中的问题 这个函数中的criteria 最多只能识别对应16位数的编码