在R中的数组中查找最接近x值的索引

在R中的数组中查找最接近x值的索引,r,R,以现有方式为目标,或构建一个函数,用于返回向量R中彼此最接近的x值的索引。下面是一个示例 a <- c(10,85,20,75,80,5,105) # function definition getIndex <- function(x, n) { } # with x: vector to test and n: number of closest value to detect # desired function output : and index identify

以现有方式为目标,或构建一个函数,用于返回向量R中彼此最接近的x值的索引。下面是一个示例

a <- c(10,85,20,75,80,5,105)

# function definition

getIndex <- function(x, n) { 
}

# with x: vector to test and n: number of closest value to detect

# desired function output : and index identifying x closest values in the vector x

ind <- c(0,1,0,1,1,0,0) # or a a logical F,T,F,T,T,F,F # here with n = 3 (looking for 3 closest values)`
a使用-

更新

library(data.table)
a <- c(10,85,20,75,80,5,105)
getIndex <- function(x, n) {
  a_ <- sort(x)
  diff <- abs(shift(a_) - a_)
  return(seq(1,length(x)) %in% sort(diff, index.return=T)$ix[1:n])
}
getIndex(a, 3)

这可以通过查找排序向量的每个
i
th和
(i+n-1)
th元素之间的最小差异来实现。最小的差异将给出最接近的n个数字

这里有一个方法与基地R-

getIndex <- function(x, n) {
  x_s <- sort(x)
  rolling_diff <- c(x_s[n:length(x_s)], rep(NA, n-1)) - x_s
  w <- which.min(rolling_diff)
  x %in% x_s[w:(w+n-1)]
}

getIndex(a, 3)
[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE

getIndex这里有一个使用
combn
的解决方案,我们找到每3个值的差,取它们的绝对和,从中找到最小值,并创建一个逻辑向量,在原始向量中找到它们

get_closest_values <- function(a, n) {
    index <- which.min(colSums(abs(combn(a, n, diff))))
    a %in% strsplit(combn(a, n, paste, collapse = "-")[index], "-")[[1]]
}

get_closest_values(a, 3)
#[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE

获取最接近的值\u我不认为这是答案–问题是关于任何三个最接近的值。@Vivek我试图对您的解决方案进行基准测试,但认为它在
shift
中缺少步长,因此在其他情况下无法获得正确的结果。这是一个聚类问题,解决方案取决于您如何定义“最接近的3个数字”。最小距离?中值还是平均距离?范围。例如,考虑这个向量:<代码> C(2, 4, 6,22, 23)< /代码>。根据你定义的“最近”,你可以得到<代码> C(2, 4, 6)< /代码>或<代码> C(22, 23, 6)。
作为你的三个最接近的数字。寻找最小的差异优秀的答案优秀的答案在R底被定义为公认的答案。天哪…我想那是因为使用了两次
combn
。@Ronaksah可能吧。我一看到
combn
就知道它不会飞了,但这对我来说也是一个惊喜。我必须带上它将
x
的长度降低到100,将
neval
的长度降低到10,以获得一些结果:
set.seed(2)
x <- sample(1000, 100)
identical(getIndex_Shree(x, 3), getIndex_Ronak(x, 3))
# [1] TRUE
microbenchmark::microbenchmark(
  shree = getIndex_Shree(x, 3),
  ronak = getIndex_Ronak(x, 3),
  times = 10
)

Unit: microseconds
  expr        min          lq         mean      median         uq         max neval
 shree      81.64      85.838     134.3092     162.346     166.08     174.476    10
 ronak 3157301.98 3249876.496 3308635.5102 3316360.354 3369009.09 3423373.176    10
get_closest_values <- function(a, n) {
    index <- which.min(colSums(abs(combn(a, n, diff))))
    a %in% strsplit(combn(a, n, paste, collapse = "-")[index], "-")[[1]]
}

get_closest_values(a, 3)
#[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE