zoo 包中的限制 na.locf
Limit na.locf in zoo package
我想对变量进行最后一次观察,但最多只能进行 2 次观察。也就是说,对于 3 个或更多 NA 的数据间隙,我只会将最后一个观察结果用于接下来的 2 个观察结果,并将其余的保留为 NA。
如果我使用 zoo::na.locf
执行此操作,maxgap
参数意味着如果间隙大于 2,则不会替换 NA。连最后2个都没有。还有其他选择吗?
x <- c(NA,3,4,5,6,NA,NA,NA,7,8)
zoo::na.locf(x, maxgap = 2) # Doesn't replace the first 2 NAs of after the 6 as the gap of NA is 3.
Desired_output <- c(NA,3,4,5,6,6,6,NA,7,8)
首先应用 na.locf0
和 maxgap = 2
给出 x0
并使用 data.table 包中的 rleid
定义分组变量 g
。对于每个这样的组,使用 ave
应用 keeper
,如果该组全部为 NA,则将其替换为 c(1, 1, NA, ..., NA),否则输出全 1。乘以 na.locf0(x)
。
library(data.table)
library(zoo)
mg <- 2
x0 <- na.locf0(x, maxgap = mg)
g <- rleid(is.na(x0))
keeper <- function(x) if (all(is.na(x))) ifelse(seq_along(x) <= mg, 1, NA) else 1
na.locf0(x) * ave(x0, g, FUN = keeper)
## [1] NA 3 4 5 6 6 6 NA 7 8
使用基础 R 的解决方案:
ave(x, cumsum(!is.na(x)), FUN = function(i){ i[1:pmin(length(i), 3)] <- i[1]; i })
# [1] NA 3 4 5 6 6 6 NA 7 8
cumsum(!is.na(x))
将 NA
中的每个 运行 分组为最近的非 NA
值。
function(i){ i[1:pmin(length(i), 3)] <- i[1]; i }
将每个组的前两个 NA
转换为该组的前导非 NA
值。
我想对变量进行最后一次观察,但最多只能进行 2 次观察。也就是说,对于 3 个或更多 NA 的数据间隙,我只会将最后一个观察结果用于接下来的 2 个观察结果,并将其余的保留为 NA。
如果我使用 zoo::na.locf
执行此操作,maxgap
参数意味着如果间隙大于 2,则不会替换 NA。连最后2个都没有。还有其他选择吗?
x <- c(NA,3,4,5,6,NA,NA,NA,7,8)
zoo::na.locf(x, maxgap = 2) # Doesn't replace the first 2 NAs of after the 6 as the gap of NA is 3.
Desired_output <- c(NA,3,4,5,6,6,6,NA,7,8)
首先应用 na.locf0
和 maxgap = 2
给出 x0
并使用 data.table 包中的 rleid
定义分组变量 g
。对于每个这样的组,使用 ave
应用 keeper
,如果该组全部为 NA,则将其替换为 c(1, 1, NA, ..., NA),否则输出全 1。乘以 na.locf0(x)
。
library(data.table)
library(zoo)
mg <- 2
x0 <- na.locf0(x, maxgap = mg)
g <- rleid(is.na(x0))
keeper <- function(x) if (all(is.na(x))) ifelse(seq_along(x) <= mg, 1, NA) else 1
na.locf0(x) * ave(x0, g, FUN = keeper)
## [1] NA 3 4 5 6 6 6 NA 7 8
使用基础 R 的解决方案:
ave(x, cumsum(!is.na(x)), FUN = function(i){ i[1:pmin(length(i), 3)] <- i[1]; i })
# [1] NA 3 4 5 6 6 6 NA 7 8
cumsum(!is.na(x))
将 NA
中的每个 运行 分组为最近的非 NA
值。
function(i){ i[1:pmin(length(i), 3)] <- i[1]; i }
将每个组的前两个 NA
转换为该组的前导非 NA
值。