r - 在向量中找到 n 个最接近位置 t 的非 NA 值

标签 r vector closest

对于那些有 R 经验的人来说,这可能是一个简单的问题,但这是我(新手)正在努力解决的问题......

我有两个向量示例,它们对我要解决的问题很常见,AB :

A <- c(1,3,NA,3,NA,4,NA,1,7,NA,2,NA,9,9,10)
B <- c(1,3,NA,NA,NA,NA,NA,NA,NA,NA,2,NA,9)

#and three scalars
R <- 4
t <- 5
N <- 3

还有第四个标量,n , 其中0<=n<=N .一般来说,N <= R .

我想找到 n最近的非 NA值为 t使得它们落在半径内 Rt 为中心.即,搜索半径,R包括 R+1值。例如A,搜索半径序列为(3,NA,3,NA,4,NA,1) , 其中t=NA , 搜索半径序列中的中间值。

预期的答案可以是 A 的两个结果之一:

answerA1 <- c(3,4,1)

answerA2 <- c(3,4,3)

B 的预期答案:

answerB <- c(1,3)

我如何以最节省时间和空间的方式完成这项任务?欢迎使用衬垫、环等。如果我必须选择一个偏好,那就是速度!

提前致谢!

注意:

对于这种情况,我了解到第三接近的非 NA value 可能涉及为第三个值选择落在 t 右侧或左侧的偏好。 (如上面两个可能的答案所示)。我对这个值是落在 t 的左边还是右边没有偏好。但是,如果有办法让它随机发生(第三个值是落在右边还是左边)那将是理想的(但是,同样,这不是必需的)。

最佳答案

一个相对简短的解决方案是:

orderedA <- A[order(abs(seq_len(length(A)) - t))][seq_len(R*2)]
n_obj <- min(sum(is.na(orderedA)), N, length(na.omit(orderedA)))
res <- na.omit(orderedA)[seq_len(n_obj)]

res
#[1] 3 4 3

进一步分解步骤如下:

  1. 按与感兴趣位置的绝对距离 t 对 A 进行排序。

    • 代码是:A[order(abs(seq_len(length(A)) - t))]
  2. 子集到第一个 R*2 元素(因此这将获取 Rt 任一侧的元素。

    • 代码是: [seq_len(R*2)]
  3. 获取第一个 min(N, # of non-NA, len of non-NA) 元素
    • 代码是: min(sum(is.na(orderedA)), N, length(na.omit(orderedA)))
  4. 丢弃 NA
    • 代码是: na.omit()
  5. 取第3步中确定的第一个元素(以较小者为准)
    • 代码是: [seq_len(n_obj)]

关于r - 在向量中找到 n 个最接近位置 t 的非 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44638760/

相关文章:

r - 尝试在 R 中进行模拟

c++ - 我们是否有增强的 std::remove_if STL 函数来保留将要删除的元素

c++ - LLDB 有时显示 vector 数据,有时不显示

C# - 最接近 0 的数字

javascript - jquery根据id匹配元素

r - ggplot2:从 ggplot 对象创建独立副本

r - 更改组合 ggplot 中的条形颜色

c++ - gdb vector 尝试获取不在内存中的地址

jQuery 最接近();

R - 在后台运行 source()