在新向量中索引 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
将非NA
与cumsum
相结合。
replace(a, !is.na(a), cumsum(na.omit(a)))
# [1] NA NA 1 NA 2 NA 3
我有一些你们可能会归类为愚蠢的问题,但我无法解决。我有这个向量:
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
将非NA
与cumsum
相结合。
replace(a, !is.na(a), cumsum(na.omit(a)))
# [1] NA NA 1 NA 2 NA 3