【问题标题】:Concise R code equivalent to the sumif function in Excel - particularly applied over data frame rows与 Excel 中的 sumif 函数等效的简洁 R 代码 - 特别适用于数据框行
【发布时间】: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。

标签: r excel apply user-defined-functions sumifs


【解决方案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% 可能是我最喜欢的数据工作运算符。不知道这个用法。谢谢!
猜你喜欢
  • 1970-01-01
  • 2020-02-27
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 2019-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多