R 将NAs替换为在每个新NA处增加1的值

R 将NAs替换为在每个新NA处增加1的值,r,R,如何将NAs替换为一个值,该值在每个新NA(不遵循先前的值)处递增1 以下是一个例子: ID 1 1 NA (replaced by 1) NA (replaced by 1) 2 2 NA (replaced by 2) NA (replaced by 2) 3 3 NA (replaced by 3) NA (replaced by 3) ... 这种情况下的预期结果是: ID 1 1 1 1 2 2 2 2 3 3 3 3 ... 数据 df <- data.frame(ID=

如何将NAs替换为一个值,该值在每个新NA(不遵循先前的值)处递增1

以下是一个例子:

ID
1
1
NA (replaced by 1)
NA (replaced by 1)
2
2
NA (replaced by 2)
NA (replaced by 2)
3
3
NA (replaced by 3)
NA (replaced by 3)
...
这种情况下的预期结果是:

ID
1
1
1
1
2
2
2
2
3
3
3
3
...
数据

 df <- data.frame(ID=c( 1 , 1 , NA , NA , 2 , 2 , NA , NA , 3 , 3 , NA , NA ))

df这里有一个非常快速、无痛的解决方案:

library(zoo)
df <- data.frame(ID=c( 1 , 1 , NA , NA , 2 , 2 , NA , NA , 3 , 3 , NA , NA ))
na.locf(df)
或者这个:

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

c(NA, df[!is.na(df)])[cumsum(!is.na(df)) + 1]
[1] 1 1 1 1 2 2 2 2 3 3 3 3

df用最后一个非NA值填充是否足够?如果是这样,则来自
zoo
软件包的
na.locf
函数会执行此操作。在您的示例中,不是每个na递增1,而是每两个na递增1。只需循环遍历数据,保留一个计数,并用
(i%/%2)
替换NA(或者如果您想要所描述的内容,只需用计数i替换)。
df <- c(1,1,NA,NA,2,2,NA,NA,3,3,NA,NA)

c(NA, df[!is.na(df)])[cumsum(!is.na(df)) + 1]
[1] 1 1 1 1 2 2 2 2 3 3 3 3