gpt4 book ai didi

用最接近的值替换 R 中的 NA

转载 作者:行者123 更新时间:2023-12-02 07:55:50 25 4
gpt4 key购买 nike

我正在 zoo 包中寻找类似于 na.locf() 的东西,但不是总是使用之前的非-NA 值 我想使用最近NA值。一些示例数据:

dat <- c(1, 3, NA, NA, 5, 7)

na.locf 替换 NA(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 的以下问题:

  1. 不,任何条目都可以不适用
  2. 如果全部不适用,则保持原样
  3. 没有。我当前的解决方案默认为左侧最接近的值,但这并不重要
  4. 这些行通常有几十万个元素,因此理论上上限将是几十万。实际上,它不会超过这里那里的几个,通常是一个。

更新 所以事实证明我们正在朝着完全不同的方向前进,但这仍然是一个有趣的讨论。谢谢大家!

最佳答案

这是一个非常快的。它使用 findInterval查找原始数据中的每个 NA 应考虑哪两个位置:

f1 <- function(dat) {
N <- length(dat)
na.pos <- which(is.na(dat))
if (length(na.pos) %in% c(0, N)) {
return(dat)
}
non.na.pos <- which(!is.na(dat))
intervals <- findInterval(na.pos, non.na.pos,
all.inside = TRUE)
left.pos <- non.na.pos[pmax(1, intervals)]
right.pos <- non.na.pos[pmin(N, intervals+1)]
left.dist <- na.pos - left.pos
right.dist <- right.pos - na.pos

dat[na.pos] <- ifelse(left.dist <= right.dist,
dat[left.pos], dat[right.pos])
return(dat)
}

我在这里测试它:

# sample data, suggested by @JeffAllen
dat <- as.integer(runif(50000, min=0, max=10))
dat[dat==0] <- NA

# computation times
system.time(r0 <- f0(dat)) # your function
# user system elapsed
# 5.52 0.00 5.52
system.time(r1 <- f1(dat)) # this function
# user system elapsed
# 0.01 0.00 0.03
identical(r0, r1)
# [1] TRUE

关于用最接近的值替换 R 中的 NA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10077415/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com