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

时间:2019-07-19 11:15:27

标签: 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 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)`

3 个答案:

答案 0 :(得分:3)

这可以通过查找排序向量的第i和第(i+n-1)个元素之间的最小差异来完成。最小的差异将为您提供最接近的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

基准-

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

答案 1 :(得分:3)

这是使用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

答案 2 :(得分:0)

使用-

更新

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)

输出

> getIndex(x, n)
[1] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE