首页 > 解决方案 > 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)

数据框已分组,因此我无法为每个组重复第一条记录的逻辑。请告诉我如何实现这一目标

谢谢您的帮助

标签: rgroup-bycalculated-columnsdplyr

解决方案


这是使用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

请注意,原始数据必须在拆分之前按组排序!


推荐阅读