首页 > 解决方案 > 将两个不同组的 cumsum 的结果分成两个不同的列?

问题描述

我试图找到两个单独组的累积总和,并将这些总和中的每一个列在单独的列中。

这是根据时间排序的数据框:

time  group  value
0     A      0
0     B      0
0     A      0
1     A      0
1     B      1
1     B      0
2     B      1
2     A      1
2     A      1
2     A     -1
3     A      0
3     B      1

这就是我必须按组查找 cumsum 并创建 cumsum 列的内容:

df$cumsum <- ave(df$value, df$group, FUN=cumsum)

time  group  value  cumsum
0     A      0      0
0     B      0      0
0     A      0      0
1     A      0      0
1     B      1      1
1     B      0      1
2     B      1      2
2     A      1      1
2     A      1      2
2     A     -1      1
3     A      0      1
3     B      1      3

如何将结果分成两列,一列用于 A,一列用于 B?或者,是否有可能找到有条件的 cumsum?无论哪种方式,我希望结果如下所示:

time  group  value  cumsum_A  cumsum_B
0      A      0     0         0
0      B      0     0         0
0      A      0     0         0
1      A      0     0         0
1      B      1     0         1
1      B      0     0         1
2      B      1     0         2
2      A      1     1         2
2      A      1     2         2
2      A     -1     1         2
3      A      0     1         2
3      B      1     1         3

谢谢!

标签: rcumsum

解决方案


您可以首先找出这些unique值并使用sapply/lapply循环它们以有条件地计算它们cumsum中的每一个。

unique_val <- unique(df$group)
df[paste0("cumsum_", unique_val)] <- lapply(unique_val, 
                     function(x) cumsum((df$group == x) * df$value))

df
#   time group value cumsum_A cumsum_B
#1     0     A     0        0        0
#2     0     B     0        0        0
#3     0     A     0        0        0
#4     1     A     0        0        0
#5     1     B     1        0        1
#6     1     B     0        0        1
#7     2     B     1        0        2
#8     2     A     1        1        2
#9     2     A     1        2        2
#10    2     A    -1        1        2
#11    3     A     0        1        2
#12    3     B     1        1        3

推荐阅读