针对现有方式或构建了一个函数,该函数返回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)`
答案 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