Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简洁的R代码,相当于Excel中的sumif函数-尤其适用于数据帧行_R_Excel_Apply_User Defined Functions_Sumifs - Fatal编程技术网

简洁的R代码,相当于Excel中的sumif函数-尤其适用于数据帧行

简洁的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(

我需要有选择地跨行添加数据框中列子集中的值。值可以采用整数0、1、2或3。2s和3s的总和(不是2s和3s的计数,这很简单)给出了我们测量的“强度”。假设我的数据框有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

如果有人有更好的方法,我很高兴听到

建议:

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
from
expss
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