简洁的R代码,相当于Excel中的sumif函数-尤其适用于数据帧行
我需要有选择地跨行添加数据框中列子集中的值。值可以采用整数0、1、2或3。2s和3s的总和(不是2s和3s的计数,这很简单)给出了我们测量的“强度”。假设我的数据框有60列,我只想看第2列到第11列。实现这一点的excel代码(一种方法)非常简单:简洁的R代码,相当于Excel中的sumif函数-尤其适用于数据帧行,r,excel,apply,user-defined-functions,sumifs,R,Excel,Apply,User Defined Functions,Sumifs,我需要有选择地跨行添加数据框中列子集中的值。值可以采用整数0、1、2或3。2s和3s的总和(不是2s和3s的计数,这很简单)给出了我们测量的“强度”。假设我的数据框有60列,我只想看第2列到第11列。实现这一点的excel代码(一种方法)非常简单:=sumif(a2:a11,“>1”)。这将添加该范围内的所有2和3 虽然我在过去使用过aggregate(),但关于这个主题的大多数答案并不是真正想做我想做的事情,我也无法找到一种方法让aggregate()以我需要的方式运行。试图让rowSums(
=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
如果有人有更好的方法,我很高兴听到 建议:
apply(data[,2:11], 1, function(x) sum(x[x %in% 2:3], na.rm = TRUE))
下面是如何使用rowSums()
与您的解决方案进行比较
apply(df[,2:11], 1, function(x) sum(2*(x==2), 3*(x==3), na.rm=TRUE))
#[1] 18 13 11 19 11
sum-row-if
fromexpss
package:sum-row-if(gt(1),df[,2:11])
Disclosure:我是软件包的作者。非常有帮助,谢谢你Gregory。啊,那更好。本质上是相同的方法(从逻辑的角度来看),但代码要简单得多。这太好了,谢谢。啊,非常有用in%可能是我最喜欢的数据处理操作符。我不知道这个用法。非常感谢。
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