如何根据多个条件替换值之间的 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,四个值中的每一个都没有数量模式。
我花了几个小时尝试 ifelse
和 for
循环但没有成功。 (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
我的动物园(时间序列)数据集如下所示,有数百行:
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,四个值中的每一个都没有数量模式。
我花了几个小时尝试 ifelse
和 for
循环但没有成功。 (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