【问题标题】:EXCEL SUMIFS IN R using ddply在 R 中使用 ddply 的 EXCEL SUMIFS
【发布时间】:2018-07-18 19:05:42
【问题描述】:

我正在尝试为我在 EXCEL 中实现的下表实现一个 SUMIFS 逻辑(分别为 A、B、C 列):

ID  x   y
123 3   50
123 2   -10
123 4   -20
124 3   50
124 2   -10
124 4   -20
  1. 使用以下公式创建一个新向量 z:

=IF(C2>0;(SUMIFS($C$2:$C$7;$A$2:$A$7;A2;$B$2:$B$7;">="&B2));C2)

  1. 将公式向下复制以填充向量 z 即可。

  2. 对于每一行,如果“y”> 0,如果 ID 相同且“x”的值大于当前行中“x”的值,则公式添加“y”的值.

在 R 中,我曾尝试编写一个 ddply 函数,但我在其中的 for 循环中挣扎。所以这就是我所在的位置:

ddply(test,.(ID,x), mutate, z = function(y))

我同样尝试过“总结”,但条件问题仍然存在。 我将不胜感激在定义函数 (y) 方面的任何帮助,以便我可以获得等效的 excel 结果。非常感谢。

【问题讨论】:

  • 你期待什么结果,你得到了什么?我把它放在电子表格上,它似乎正在工作,但我不知道你在期待什么。我得到 30、-10、-20、30、-10、-20。
  • 嗨,蒂姆 - 同意,公式在 excel 中有效。我正在寻找一种方法来使用 ddply 或任何其他合适的函数在 R 中执行此操作。
  • 啊,这就是我出错的地方。

标签: r excel apply plyr sumifs


【解决方案1】:

这有点蛮力,可能不是最好的方法,但它复制了 Excel 输出:

# sample data:
df <- read.table(text = 'ID  x   y
                 123 3   50
                 123 2   -10
                 123 4   -20
                 124 3   50
                 124 2   -10
                 124 4   -20', header = TRUE)

# create a new column called 'sum_y' using the defined rules:
for(i in 1:nrow(df)){
  if (df$y[i] > 0) df$sum_y[i] = sum(df$y[df$x >= df$x[i] & df$ID == df$ID[i]])
  else df$sum_y[i] = df$y[i] 
}

# view the output:
df
   ID x   y sum_y
1 123 3  50    30
2 123 2 -10   -10
3 123 4 -20   -20
4 124 3  50    30
5 124 2 -10   -10
6 124 4 -20   -20

【讨论】:

    【解决方案2】:

    我将您的公式粘贴到工作表中并修改如下...

    =IF(C2>0,(SUMIFS($C$2:$C$7,$A$2:$A$7,A2,$B$2:$B$7,">="&B2)),C2)
    

    我把分号改成了逗号。

    我得到的结果...

    【讨论】:

      猜你喜欢
      • 2014-12-30
      • 2012-08-18
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多