r - 将两个不同组的 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
谢谢!
解决方案
您可以首先找出这些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
推荐阅读
- javascript - 导出画布后 for 循环显示为空白
- python - 使用 xarray 获取下载数据集(CDS API)的属性和详细信息
- go - Worker Pool 并发模式中何时关闭结果通道?
- c++ - platformIO 中的本机单元测试:ld:未找到架构 x86_64 的符号
- sql - 在 SQLPLUS 中,不能将视图列命名为数字
- c++ - 请解释为什么此代码打印 02002 而不是 00022
- java - Vaadin 无法导入 CSS 文件
- angular - rxjs:错误后保持无限流活着
- java - Hibernate 在启动时删除表的所有内容,即使 hbm2ddl.auto 设置为更新
- python - 根据其他数据集添加具有重复值的列 - pandas(将股票市场指数的数据按天添加到每个股票。)