在新向量中索引 TRUE 事件并保留 NA

Index TRUE occurrences preserving NA in a new vector

我有一些你们可能会归类为愚蠢的问题,但我无法解决。我有这个向量:

a <- c(NA,NA,TRUE,NA,TRUE,NA,TRUE)

我想把它放在一个新的向量中:

b <- c(NA,NA,1,NA,2,NA,3)

就这么简单。我尝试的所有方法都不能保留 NA,我需要它们保持不变。如果在 base R 中有一种方法,我更愿意。

在 base R 中,使用 cumsum() 同时排除 NA 值:

a <- c(NA,NA,TRUE,NA,TRUE,NA,TRUE)

a[!is.na(a)] <- cumsum(a[!is.na(a)])

输出:

[1] NA NA  1 NA  2 NA  3

使用 base R

中的 replace
b <- replace(a, !is.na(a), seq_len(sum(a, na.rm = TRUE)))
b
[1] NA NA  1 NA  2 NA  3

或更紧凑的选项(如果值为 logical/numeric)

cumsum(!is.na(a)) * a
[1] NA NA  1 NA  2 NA  3

更新

如果OP的向量是

a <- c(NA,NA,TRUE,NA,FALSE,NA,TRUE)
 (a|!a) * cumsum(replace(a, is.na(a), 0))
[1] NA NA  1 NA  1 NA  2

replace将非NAcumsum相结合。

replace(a, !is.na(a), cumsum(na.omit(a)))
# [1] NA NA  1 NA  2 NA  3