我有一个包含两列的数据框:
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()不能做这种向后引用,但我不能为我的生活弄清楚如何用循环来做。任何建议都会很棒,因为我现在正在拔头发!
答案 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