r - R - 按组的累积产品和总和
问题描述
我有以下数据集,并想添加一个新列“colY”。如何实现(下面展示了colY是如何计算的)?
GROUP ID colX colY
1 1 0.8 =0.8*(1+0.7*(1+0.6))
1 2 0.7 =0.7*(1+0.6)
1 3 0.6 =0.6
2 1 1.3 =1.3*(1+1.2*(1+1.1*(1+1.0)))
2 2 1.2 =1.2*(1+1.1*(1+1.0))
2 3 1.1 =1.1*(1+1.0)
2 4 1.0 =1.0
最好在 data.table 语法中。谢谢!
解决方案
检查这个
runsum <- function(x){
b <- as.numeric()
len <- length(x)
for(i in 1:len){
b[i] <- sum(cumprod(x[i:len]))
}
return(b)
}
dt[, colY := runsum(colX),by=GROUP]
结果:
GROUP ID colX colY
1: 1 1 0.8 1.696
2: 1 2 0.7 1.120
3: 1 3 0.6 0.600
4: 2 1 1.3 6.292
5: 2 2 1.2 3.840
6: 2 3 1.1 2.200
7: 2 4 1.0 1.000
数据:
library(data.table)
dt <- fread("GROUP ID colX
1 1 0.8
1 2 0.7
1 3 0.6
2 1 1.3
2 2 1.2
2 3 1.1
2 4 1.0 ")
我认为有一些更好的方法来替换 function runsum
,但我没有,这里我只是使用自定义函数来展示基本思想。欢迎任何改进。
推荐阅读
- c# - C#如何从字符串呈现标签助手
- flutter - 在 Dart 的列表中使用 map 或 for 循环有什么区别吗?
- r - 如何对数据框中的行进行排序以获取 R 中某些列的最大净值和符号
- python - Python - 计算 NumPy 数组中元素和邻居的平均绝对差
- reactjs - 手动刷新页面时如何强制app.js中的useEffect在其他组件的useEffect之前加载
- django - AWS RDS 重命名数据库名称
- python - 如何识别 kmeans 集群图中的标签?
- apache-spark - 与 Pythonic 版本相比,为什么在 PySpark 中转换后我会丢失数据框中的一些记录?
- node.js - 为什么我在 MongoDB Atlas 与本地的连接速度非常慢
- visual-studio-code - 如何跳过放置在工作区文件夹上方目录中的多根 vscode 中的文件?