相当于 Excel 中的 sumif 函数的简明 R 代码 - 特别适用于数据框行
Concise R code equivalent to the sumif function in Excel - particularly applied over data frame rows
我需要从数据框中的列子集中选择性地跨行添加值。值可以采用整数 0、1、2 或 3。2 和 3 的总和(不是 2 和 3 的计数,这很简单)给出了我们正在测量的 "intensity"。假设我的数据框有 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))
#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
我需要从数据框中的列子集中选择性地跨行添加值。值可以采用整数 0、1、2 或 3。2 和 3 的总和(不是 2 和 3 的计数,这很简单)给出了我们正在测量的 "intensity"。假设我的数据框有 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))
#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