我有一个数据帧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中实现此逻辑?提前谢谢!
答案 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^