R语言中获取向量内彼此最接近的n个值的索引方法咨询
这是个很实用的需求!我来帮你实现这个函数,咱们先理清楚核心思路:要找到向量中彼此最接近的n个值,本质上就是找极差最小的n元子集——因为极差越小,说明这组值的分布越紧凑,元素之间的距离整体上最近。
完整函数实现
getIndex <- function(x, n) { # 边界情况处理:如果n等于向量长度,直接返回全TRUE if (n == length(x)) { return(rep(TRUE, length(x))) } # 输入合法性校验,避免无效参数 if (n < 1 || n > length(x)) { stop("n必须介于1和输入向量的长度之间哦!") } # 对向量排序,同时保留每个元素的原始索引 sorted_info <- sort(x, index.return = TRUE) sorted_vals <- sorted_info$x sorted_original_indices <- sorted_info$ix # 用滑动窗口遍历所有可能的n元子集,计算每个子集的极差 window_ranges <- sapply(1:(length(sorted_vals) - n + 1), function(i) { current_window <- sorted_vals[i:(i + n - 1)] max(current_window) - min(current_window) }) # 找到极差最小的那个窗口的起始位置 best_window_start <- which.min(window_ranges) # 获取这个窗口对应的原始向量索引 target_indices <- sorted_original_indices[best_window_start:(best_window_start + n - 1)] # 生成最终的逻辑向量结果 result <- logical(length(x)) result[target_indices] <- TRUE return(result) }
测试你的示例
用你提供的向量测试一下,完全符合预期:
a <- c(10,85,20,75,80,5,105) # 调用函数,n=3 getIndex(a, 3) # 输出:FALSE TRUE FALSE TRUE TRUE FALSE FALSE
额外说明
- 如果存在多组n元子集的极差相同(也就是有多组值的接近程度一样),
which.min会返回第一个出现的窗口对应的索引。如果你需要处理这种多解场景,可以修改代码,把所有符合条件的窗口都纳入结果。 - 函数做了全面的边界处理:比如n=1时会返回全TRUE(因为每个元素自身就是最接近的),n超出向量长度时会抛出明确的错误提示。
内容的提问来源于stack exchange,提问作者dambach
相关产品推荐
相关产品推荐

