我的数据看起来像这样:
id <- c(1,1,1,1,1,1,2,2,2,2,3,3,3,3,3,3,3,3,3,4,4,4)
start <- c(NA, NA, NA, 1, NA, NA, NA, NA, 1, NA, NA, NA, 1, NA, NA, NA, NA, NA, 1, NA, NA, NA)
e <- as.data.frame(cbind(id, start))
我想在每次start == 1或有新ID时都以累积总和的类比来填充NA。我做了一个for循环,但是我的实际数据太长,无法在最近几天结束。有没有办法加快我的解决方案?我的目标变量可以复制如下:
e$target <- NA
for (i in 2:length(e$id)){
if (e$id[i]!=e$id[i-1]){
e$target[i] <- NA
} else {
e$target[i] <- e$target[i-1]+1
if (!is.na(e$start[i]==1)){
e$target[i] <- 0
}
}
}
我们可以做到这一点 data.table
library(data.table)
setDT(e)[, target1 := seq_len(.N)-1,.(grp = cumsum(!is.na(start)), id)]
e[e[, c(.I[all(is.na(start))], .I[seq_len(which.max(!is.na(start))-1)]),
id]$V1, target1 := NA]
e
# id start target target1
# 1: 1 NA NA NA
# 2: 1 NA NA NA
# 3: 1 NA NA NA
# 4: 1 1 0 0
# 5: 1 NA 1 1
# 6: 1 NA 2 2
# 7: 2 NA NA NA
# 8: 2 NA NA NA
# 9: 2 1 0 0
#10: 2 NA 1 1
#11: 3 NA NA NA
#12: 3 NA NA NA
#13: 3 1 0 0
#14: 3 NA 1 1
#15: 3 NA 2 2
#16: 3 NA 3 3
#17: 3 NA 4 4
#18: 3 NA 5 5
#19: 3 1 0 0
#20: 4 NA NA NA
#21: 4 NA NA NA
#22: 4 NA NA NA
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句