如何根据多个条件替换值之间的 NA 值

How to replace NA values between values based on multiple conditions

我的动物园(时间序列)数据集如下所示,有数百行:

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 
NA NA NA NA  1  1  1 NA NA NA  3  3  3 NA NA  1  1

cycle4I <- zoo(c(NA, NA, NA, NA, 1, 1, 1, NA, NA, NA, 3, 3, 3, NA, NA, 1, 1))

这个变量是一个更大的动物园数据集的一部分。此变量的一般模式是一系列 1,然后是 NA,然后是 3,然后是 NA,然后再次从一系列 1 开始重复该模式。 NA数量没有规律

我正在尝试 (i) 用 2 填充 1 和 3 之间的 NA,(ii) 用 4 填充 3 和后续 1 之间的 NA,以及 (iii) 填充前四个观察值中的 NA 4遵循一般模式。完成后,这些值将是一系列 1、2、3 和 4,四个值中的每一个都没有数量模式。

我花了几个小时尝试 ifelsefor 循环但没有成功。 (R 的这一部分相对较新。)

我以前在 Stata 中做过这个任务,但无法找出 R 中的代码来填充 NA。填充 NA 的 Stata 代码是:

replace cycle4I = 2 if missing(cycle4I) & (cycle4I[_n-1] == 1 | cycle4I[_n-1] == 2) & (cycle4I[_n+1] == . | cycle4I[_n+1] == 3)

replace cycle4I = 4 if missing(cycle4I) & (cycle4I[_n-1] == 3 | cycle4I[_n-1] == 4) & (cycle4I[_n+1] == . | cycle4I[_n+1] == 1)

这是一种方法

library(dplyr)
library(zoo)

data_frame(cycle4I = c(NA, NA, NA, NA, 1, 1, 1, NA, NA, NA, 3, 3, 3, NA, NA, 1, 1)) %>%
  mutate(final = 
           cycle4I %>%
           lag %>%
           na.locf(na.rm = FALSE) %>%
           `+`(1) %>%
           ifelse(is.na(cycle4I),
                  ., cycle4I) )

这是一个简单的方法:

library(zoo)
cycle4I <- zoo(c(NA, NA, NA, NA, 1, 1, 1, NA, NA, NA, 3, 3, 3, NA, NA, 1, 1))

x <- cycle4I

x[1] <- 3
x <- is.na(x) + na.locf(x)
x[1] <- 4

给出:

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 
 4  4  4  4  1  1  1  2  2  2  3  3  3  4  4  1  1