对于那些有 R 经验的人来说,这可能是一个简单的问题,但这是我(新手)正在努力解决的问题......
我有两个向量示例,它们对我要解决的问题很常见,A
和 B
:
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
使得它们落在半径内 R
以 t
为中心.即,搜索半径,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
进一步分解步骤如下:
按与感兴趣位置的绝对距离
t
对 A 进行排序。- 代码是:
A[order(abs(seq_len(length(A)) - t))]
- 代码是:
子集到第一个
R*2
元素(因此这将获取R
中t
任一侧的元素。- 代码是:
[seq_len(R*2)]
- 代码是:
- 获取第一个
min(N, # of non-NA, len of non-NA)
元素- 代码是:
min(sum(is.na(orderedA)), N, length(na.omit(orderedA)))
- 代码是:
- 丢弃
NA
- 代码是:
na.omit()
- 代码是:
- 取第3步中确定的第一个元素(以较小者为准)
- 代码是:
[seq_len(n_obj)]
- 代码是:
关于r - 在向量中找到 n 个最接近位置 t 的非 NA 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44638760/