基于dplyr与map实现最小差异行的id列表生成
解决方案
可以结合purrr::map和向量化的差异计算来实现,避免手动构建列表或方阵,代码更简洁且可复用:
library(tidyverse) df <- tibble( A= c("x","x","y","y"), B= c("y","y","y","y"), C= c("x","y","z","y") ) %>% mutate(id = row_number(), .before = "A") # 用map按行生成neighs_id df <- df %>% mutate(neighs_id = map(id, ~{ # 计算当前行与所有行在A、B、C列的差异列数 diff_cols <- (A != df$A[.x]) + (B != df$B[.x]) + (C != df$C[.x]) # 筛选差异恰好为1的行的id,排除自身 df$id[diff_cols == 1 & id != .x] # 若需字符型列表,替换为:as.character(df$id[diff_cols == 1 & id != .x]) })) View(df)
逻辑说明
- 用
map遍历每一行的id,对每个行号.x,通过向量化运算计算所有行与该行在A、B、C三列的差异总和(每列值不同则加1) - 筛选出差异总和等于1且不是当前行自身的
id,直接收集为列表列neighs_id - 这种向量化计算方式比逐行循环或构建全量差异方阵更高效,代码逻辑清晰且易于扩展到更多列
内容的提问来源于stack exchange,提问作者GiulioGCantone
相关产品推荐
相关产品推荐

