R语言中如何从向量z筛选与向量y最接近的值?推荐函数是什么?
从向量z中筛选与y元素最接近值的R方法
给定两个数值向量y和z,要从z中筛选出与y元素最接近(无需完全相等)的值,推荐以下几种实用的R实现方式:
1. Base R原生实现
利用sapply遍历y的每个元素,结合which.min找到z中差值最小的对应元素:
# 定义向量 y <- c(54.36, 70.43, 36.49, 39.59, 15.06, 34.60, 0.24, 24.00, 20.22, 24.73, 29.86, 49.30, 37.36, 29.68, 37.64, 7.99, 22.42, 28.99, 3.09, 63.92, 17.72, 9.51, 13.06, 3.83, 51.91, 1.79, 16.86, 50.74, 28.41, 20.03, 24.24, 33.70, 7.70, 24.83, 53.98, -8.74, 30.14, 20.80, 12.10, 38.31, 35.35, 33.96, 25.07, 44.86, 18.73, 36.66, 19.57, 30.62, -0.65, 21.66, 54.59, 35.28, 27.83, 48.27, 17.99) z <- c(53.0, 17.5, 48.5, 40.0, 46.0, 38.0, 14.5, 19.5, 37.5, 5.5, 16.0, 25.0, 11.0, 17.5, 14.0, 21.0, 22.5, 0.0, 3.0, 18.5, 37.0, 53.0, 33.0, 47.0, 18.5, 22.0, 14.5, 48.5, 48.0, 26.0, 28.0, 56.5, 15.0, 29.5, 7.5, 35.0, 7.0, 25.5, 21.0, 8.5, 53.0, 51.5, 9.0, 15.0, 20.5, 13.0, 23.0, 15.0, 18.0, 38.5, 7.0, 17.5, 35.0, 29.5, 16.5, 34.5, 27.5, 18.5, 18.5, 24.0, 24.0, 30.5, 28.0, 27.0, 15.5, 12.5, 23.0, 22.0, 45.0, 12.0, 19.0, 10.0, 85.5, 16.0, 34.5, 43.0, 27.0, 13.0, 22.5, 30.5, 22.0, 59.0, 21.0, 7.5, 23.0, 10.5, 16.0, 20.0, 62.0, 13.0, 64.0, 52.0, 18.5, 33.0, 0.0, 25.0, 11.0, 16.5, 17.0, 48.0, 30.5, 21.5, 18.0, 19.5, 11.0, 95.0, 38.0, 17.5, 42.5, 7.0, 48.0, 38.0, 23.5, 16.5, 7.5, 51.0, 14.5, 20.5, 23.5, 8.0, 46.0, 45.0, 64.0, 75.0, 35.0, 10.0, 10.0, 10.5, 12.0, 12.0, 13.0, 15.5, 39.0, 29.5, 3.0, 13.0, 25.0, 5.0, 0.0, 29.0, 28.0, 7.5, 14.0, 26.5, 19.5, 62.0, 23.0, 8.5, 31.5, 23.5, 26.0, 11.0, 18.5, 28.0, 31.0, 42.0, 57.0, 54.0, 10.0, 12.5, 13.5, 11.0, 8.0, 35.5, 60.0, 18.0, 101.5, 15.0, 21.5, 9.5, 17.5, 18.0, 16.0, 28.5, 35.0, 47.0, 26.0, 50.5, 13.0, 18.5, 14.0, 18.5, 27.0, 33.0, 28.5, 24.5, 34.5, 9.0, 9.0, 53.5, 15.0, 14.0, 18.0, 16.5, 27.0, 11.5, 14.0, 27.0, 10.0, 46.0, 0.0, 18.0, 27.5, 67.5, 22.5, 12.5, 26.0, 24.5, 0.0, 22.0, 12.0, 30.5, 23.5, 2.5, 15.5, 34.5, 50.0, 62.0, 5.0, 9.5, 11.0, 10.5, 6.5, 23.0, 12.5, 18.0, 17.5, 31.5, 42.5, 15.0, 54.5, 48.5, 9.5, 16.5, 18.0, 42.0, 49.0, 4.0, 42.0, 47.0, 13.5, 28.0, 8.0, 43.0, 8.5, 10.0, 26.5, 13.5, 28.0, 37.0, 23.5, 10.5, 45.0, 15.0, 10.0, 35.0, 36.0, 20.5, 17.0, 22.5, 64.5, 21.0, 25.0, 8.0, 12.5, 21.5, 24.0, 8.5, 27.0, 70.0, 34.0, 31.5, 12.0, 5.5, 36.0, 28.0, 6.5, 14.5, 18.5, 21.5, 20.0, 23.5, 20.0, 27.0, 19.0, 17.0, 10.0, 50.0, 36.0, 8.0, 22.0, 58.5, 30.0, 19.5, 0.0, 22.0, 0.0, 7.5, 0.0, 59.0, 13.0, 4.5, 19.0, 14.0, 0.0, 17.5, 19.5) # 匹配每个y元素对应的z中最接近值 closest_values <- sapply(y, function(x) { z[which.min(abs(z - x))] }) # 去重得到z中所有符合条件的唯一值 unique_closest <- unique(closest_values)
核心逻辑:abs(z - x)计算y元素x与z所有元素的绝对差值,which.min定位差值最小的位置,最终取出对应z值。
2. Tidyverse风格实现
如果常用tidyverse工具包,用purrr::map_dbl可以简化代码:
library(purrr) closest_values <- map_dbl(y, ~ z[which.min(abs(z - .x))]) unique_closest <- unique(closest_values)
3. 带阈值的匹配优化
如果需要过滤掉差值过大的匹配结果,可以添加阈值判断,比如只保留差值小于2的结果:
closest_values_with_threshold <- sapply(y, function(x) { diffs <- abs(z - x) min_diff <- min(diffs) if (min_diff < 2) { # 可根据需求调整阈值 z[which.min(diffs)] } else { NA } }) # 过滤NA并去重 valid_closest <- na.omit(unique(closest_values_with_threshold))
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

