R使用先前的迭代结果进行下一次迭代

时间:2014-05-12 15:25:59

标签: r loops dynamic recursion apply

我有一个包含两列的数据框:

id  score  
1     0.5  
1     0.7  
1     0.8  
2     0.7  
2     0.8  
2     0.9  

我想通过迭代"得分"的行来生成一个新列(" new"),应用两个函数之一(" function1"或者" function2"),取决于" id"与最后一行id值不同或相同。这部分我可以做,我的问题是我希望function2引用function1生成的值。类似的东西:

function1 <- function(score) {new <- score*10 return(new)}
function2 <- function(score) {new <- score*new[-1] return(new)}

id  score  new    
1     0.5  5   
1     0.7  3.5  
1     0.8  2.8  
2     0.7  7  
2     0.8  5.6  
2     0.9  5.04  

我知道apply()不能做这种向后引用,但我不能为我的生活弄清楚如何用循环来做。任何建议都会很棒,因为我现在正在拔头发!

2 个答案:

答案 0 :(得分:4)

对于问题中的具体示例:

DT <- read.table(text="id  score  
1     0.5  
1     0.7  
1     0.8  
2     0.7  
2     0.8  
2     0.9  ", header=TRUE)

library(data.table)
setDT(DT)

DT[, new := 10*cumprod(score), by=id]
#   id score  new
#1:  1   0.5 5.00
#2:  1   0.7 3.50
#3:  1   0.8 2.80
#4:  2   0.7 7.00
#5:  2   0.8 5.60
#6:  2   0.9 5.04

在更一般的情况下,我需要使用Reduce的{​​{1}}。

答案 1 :(得分:4)

df <- data.frame(id=rep(c(1,2),each=3), score=c(.5,.7,.8,.7,.8,.9))

这可以通过mutate()包中的dplyr函数相对简单地完成:

require(dplyr)    
mutate(group_by(df, id), new = 10*cumprod(score))

#Source: local data frame [6 x 3]
#Groups: id

#  id score  new
#1  1   0.5 5.00
#2  1   0.7 3.50
#3  1   0.8 2.80
#4  2   0.7 7.00
#5  2   0.8 5.60
#6  2   0.9 5.04