r - R:定义列,其中第一条记录是来自其他列的计算,并且使用同一列中的先前记录更新后续记录
问题描述
我想创建列“结果”,这样
df <- policy income expense rate result
1 1 50 250 2 75 (250/2-50)
2 1 50 35 2 05 ((75+35)/2-50)
3 1 50 35 2 -30 ((5+35)/2-50)
4 2 70 600 3 130 (600/3-70)
5 2 70 50 3 -10 ((130+50)/3-70)
6 2 70 50 3 -56.6 ((-10+50)/3-70)
数据框已分组,因此我无法为每个组重复第一条记录的逻辑。请告诉我如何实现这一目标
谢谢您的帮助
解决方案
这是使用for
循环的解决方案。
数据:
df <- data.frame(policy = c(1,1,1,2,2,2),
income = c(50,50,50,70,70,70),
expense = c(250,35,35,600,50,50),
rate = c(2,2,2,3,3,3))
首先,我们通过分组来分割数据policy
:
dftemp <- split(df, df$policy)
然后我们为我们的结果初始化一个列表并填充列表中的向量NA
以避免在循环中增长它们:
resulttemp <- vector("list", length(dftemp))
for(i in 1:length(resulttemp)){
resulttemp[[i]] <- rep(NA, nrow(dftemp[[i]]))
}
现在我们遍历分割的数据以获得我们的结果:
for(i in 1:length(dftemp)){
for(j in 1:nrow(dftemp[[i]])){
if(j == 1){
resulttemp[[i]][j] <- dftemp[[i]]$expense[j]/dftemp[[i]]$rate[j]-dftemp[[i]]$income[j]
}else{
resulttemp[[i]][j] <- (resulttemp[[i]][j-1]+dftemp[[i]]$expense[j])/dftemp[[i]]$rate[j]-dftemp[[i]]$income[j]
}
}
}
然后我们unlist
我们的结果并将它们添加到原始数据中:
df$result <- unlist(resulttemp)
df
policy income expense rate result
1 1 50 250 2 75.00000
2 1 50 35 2 5.00000
3 1 50 35 2 -30.00000
4 2 70 600 3 130.00000
5 2 70 50 3 -10.00000
6 2 70 50 3 -56.66667
请注意,原始数据必须在拆分之前按组排序!
推荐阅读
- python - python 3.7安装pygal并以不合理的错误中断
- angular - 如何修复 Angular 应用程序以再次在 Chrome 中工作?
- android - Unity 2019 gradle 构建失败
- python - 在推文中查找表情符号作为整个集群而不是单个字符
- c# - FB.ShareLink 返回错误 ShareLink Error: API_ERROR: API_ERROR
- python-3.x - 如何检查 PyOpenGL 中两个对象之间的距离?
- javascript - 在 Javascript 或 Python 中是否有可能在 R 中实现诸如“非标准评估”之类的东西?
- python - Python嵌套字典键值比较
- node.js - Express - `req.body` 始终为空
- perl - perl中的符号链接两个目录