5

我想对变量进行最后一次观察,但最多只能进行 2 次观察。也就是说,对于 3 个或更多 NA 的数据间隙,我只会将最后一个观察结果转移到接下来的 2 个观察结果,其余的保留为 NA。

如果我使用 执行此操作,则zoo::na.locfmaxgap参数意味着如果间隙大于 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)
4

2 回答 2

5

首先应用na.locf0给定maxgap = 2并使用来自 data.table 包x0的分组变量。对于每个这样的组,如果该组全部为 NA,则使用它用 c(1, 1, NA, ..., NA) 替换它,否则输出全部 1。乘以那个。grleidavekeeperna.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
于 2018-09-13T14:18:36.190 回答
3

使用基础 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将每次运行的s 与最近的非NA值分组。

function(i){ i[1:pmin(length(i), 3)] <- i[1]; i }NA将每组的前两个s 转换为该组的前导非NA值。

于 2018-09-13T14:26:16.457 回答