【发布时间】:2012-04-22 01:47:04
【问题描述】:
我在 zoo 包中寻找类似于 na.locf() 的东西,但不是总是使用 previous 非NA 值我想使用 最近的非NA值。一些示例数据:
dat <- c(1, 3, NA, NA, 5, 7)
将NA 替换为na.locf(3 结转):
library(zoo)
na.locf(dat)
# 1 3 3 3 5 7
和na.locf 与fromLast 设置为TRUE(5 向后携带):
na.locf(dat, fromLast = TRUE)
# 1 3 5 5 5 7
但我希望使用 最近 非NA 值。在我的示例中,这意味着应该将 3 前移到第一个 NA,并将 5 后移到第二个 NA:
1 3 3 5 5 7
我编写了一个解决方案,但想确保我没有重新发明轮子。是不是已经有什么东西飘过来了?
仅供参考,我当前的代码如下。也许如果不出意外,有人可以建议如何提高效率。我觉得我缺少一个明显的改进方法:
na.pos <- which(is.na(dat))
if (length(na.pos) == length(dat)) {
return(dat)
}
non.na.pos <- setdiff(seq_along(dat), na.pos)
nearest.non.na.pos <- sapply(na.pos, function(x) {
return(which.min(abs(non.na.pos - x)))
})
dat[na.pos] <- dat[non.na.pos[nearest.non.na.pos]]
回答以下smci的问题:
- 不,任何条目都可以是 NA
- 如果都是 NA,则保持原样
- 没有。我当前的解决方案默认为左侧最接近的值,但这没关系
- 这些行通常有几十万个元素,因此理论上上限为几十万。实际上,这里和那里最多只有几个,通常是一个。
更新所以事实证明我们正在朝着完全不同的方向前进,但这仍然是一个有趣的讨论。谢谢大家!
【问题讨论】:
-
你看过na.locf的可选参数了吗?
fromLast看起来可以做你想做的事。 -
它没有,因为它只是在相反的方向上取先前的值。它不会找到最近的非NA值
-
'介意发布您的解决方案吗?我很想看看你有什么。
-
刚刚做了,意识到如果不出意外,这可能会变成如何让我做得更好
-
我们可以遍历
rle(which(is.na(dat)))。并不是说这是最有效的,但它是一种改进。另请参阅 "How can I count runs in R?",它需要调整rle.na()来处理 NA。
标签: r na missing-data