用1s之间的累计总和填充0-1列

用户名

我的数据看起来像这样:

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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章