通过对R中的标记行进行分组,将2列中的行相乘

时间:2016-07-25 12:58:01

标签: r dataframe logic

我有一个数据帧DF,它有以下数据;大约300000行

<DF
A B C
1 2 0
2 5 0
4 5 2
4 7 0
7 8 0
9 7 -2
2 5 0
4 7 0
5 1 2
4 7 0
7 8 0
9 7 -2
2 5 0
4 7 0
5 1 2

我想使用以下逻辑对数据集执行数学运算

  

选择C中第一次出现2的所有行(忽略中间的-2)

     

计算所有这些(A * B)的平均值并将其添加到列D(暗示D列中的所有这些行将具有相同的值)

     

选择从第一次出现的2到第二次出现的所有行

     

计算这些行的平均值(A * B)并将其添加到列D

     

......做同样的事情

     

选择从上次出现的2到最后一次出现的所有行

     

计算这些行的平均值(A * B)并将其添加到列D

结果应该是

<Result
A B C D
1 2 0 6
2 5 0 6
4 5 2 34.16667
4 7 0 34.16667
7 8 0 34.16667
9 7 -2 34.16667
2 5 0 34.16667
4 7 0 34.16667
5 1 2 27.85714
4 7 0 27.85714
7 8 0 27.85714
9 7 -2 27.85714
2 5 0 27.85714
4 7 0 27.85714
5 1 2 NA

如何在R中实现此逻辑?提前谢谢!

2 个答案:

答案 0 :(得分:1)

使用dplyr

library(dplyr)
df <- df %>% 
        mutate(ind = cumsum(C == 2)) %>% 
        group_by(ind) %>% 
        mutate(D = mean(A*B), D = replace(D, n() == 1, NA))

答案 1 :(得分:1)

以下是data.table的选项。转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(DF)),按逻辑向量的累加和(C==2)分组,得到mean的{​​{1}}并乘以{{1}生成的值}(A * B为等于或等于1的行返回逻辑向量TRUE / FALSE,并使用NA^(.N==1)将其转换为NA / 1),以便所有只有一个元素的组返回NA和其他人拥有.N==1

NA^