如何使用distances包的nearest_neighbor_search函数获取近邻
我懂你的需求啦——已经用distances包生成了距离矩阵,想通过nearest_neighbor_search函数高效获取每个样本排除自身后的3个最近邻,不用手动排序折腾。下面我一步步教你正确使用这个函数,还会验证结果和你手动得到的一致哦!
使用
distances包的nearest_neighbor_search获取最近邻 首先先回顾你已经完成的代码(生成距离矩阵对象):
library(distances) library(dplyr) set.seed(42) x <- matrix(rnorm(100), ncol = 10) df <- as.data.frame(x) df$id <- paste0("x_", seq.int(nrow(df))) distances <- distances(df, id_variable = "id")
一步获取目标最近邻
nearest_neighbor_search专门用来处理distances对象,参数设置非常直观:
k = 3:指定要获取3个最近邻exclude_self = TRUE:自动排除样本自身,不用你手动过滤
直接运行这段代码:
# 获取每个样本的3个最近邻(排除自身) nn_results <- nearest_neighbor_search(distances, k = 3, exclude_self = TRUE) # 查看整体结果 nn_results
查看单个样本的结果
比如你之前关注的x_1,可以直接提取它的结果:
nn_results[["x_1"]]
输出会和你手动排序得到的完全匹配:
id distance 10 x_10 2.1809974 4 x_4 3.6430598 2 x_2 3.8431826
把结果整理成结构化数据框
如果想要更方便后续分析的表格格式,可以用purrr和dplyr把结果整合:
library(purrr) nn_df <- map_dfr(nn_results, ~ as.data.frame(.x), .id = "target_id") # 查看整理后的表格 nn_df
这样你会得到一个包含三列的数据集:target_id(当前样本ID)、id(最近邻ID)、distance(两者间的距离),一目了然。
为什么推荐用内置函数?
你手动排序的方法虽然能得到正确结果,但nearest_neighbor_search是包内优化过的方法,当数据集变大时,效率会比手动处理高很多,而且代码更简洁,减少出错的可能性。
内容的提问来源于stack exchange,提问作者cs0815
相关产品推荐
相关产品推荐

