基于Block-ID的数值与字符记录匹配相似度计算工具需求(R语言)
R语言实现分组自定义相似度计算方案
核心思路
无需依赖特定相似度工具包,用dplyr+tidyr的组合就能实现按Block_ID分组,自定义规则计算所有Report_ID配对的相似度,灵活度拉满,还能轻松调整计算逻辑。
步骤实现
1. 加载依赖包
library(dplyr) library(tidyr)
2. 构造示例数据(可替换为你的实际数据)
df <- tibble( Report_ID = c("R1", "R2", "R3", "R4", "R5"), Block_ID = c("B1", "B1", "B1", "B2", "B2"), Number = c(10, 20, NA, 15, 15), Character = c("A", "A", "B", NA, "C") )
3. 自定义相似度计算函数
完全按照需求编写,后续要修改规则(比如改成数值绝对差)直接改函数即可:
# 数值相似度:较小值/较大值,任一NA则返回NA sim_number <- function(x, y) { if (is.na(x) || is.na(y)) return(NA_real_) min(x, y) / max(x, y) } # 字符相似度:匹配返回1,不匹配返回0,任一NA则返回NA sim_character <- function(x, y) { if (is.na(x) || is.na(y)) return(NA_real_) as.integer(x == y) }
4. 分组计算所有配对的相似度
这里提供两种简洁的实现方式:
方式一:用crossing生成配对(代码更简洁)
result <- df %>% group_by(Block_ID) %>% # 生成组内所有Report_ID的笛卡尔积配对 crossing(., .) %>% # 过滤掉自身配对和重复的反向配对(比如保留R1-R2,去掉R2-R1) filter(Report_ID.x < Report_ID.y) %>% # 计算两种相似度 mutate( Similarity_Number = sim_number(Number.x, Number.y), Similarity_Character = sim_character(Character.x, Character.y) ) %>% # 整理列名 select(Block_ID, Report_ID_1 = Report_ID.x, Report_ID_2 = Report_ID.y, Similarity_Number, Similarity_Character) print(result)
方式二:用combn生成配对(适合需要更精细控制配对逻辑的场景)
result <- df %>% group_by(Block_ID) %>% summarise( # 生成组内所有两两Report_ID配对、数值配对、字符配对的列表 report_pairs = list(combn(Report_ID, 2, simplify = FALSE)), num_pairs = list(combn(Number, 2, simplify = FALSE)), char_pairs = list(combn(Character, 2, simplify = FALSE)) ) %>% # 展开列表为行 unnest(c(report_pairs, num_pairs, char_pairs)) %>% # 拆分配对为单独列,并计算相似度 mutate( Report_ID_1 = map_chr(report_pairs, 1), Report_ID_2 = map_chr(report_pairs, 2), Similarity_Number = map2_dbl(num_pairs, ~sim_number(.x, .y)), Similarity_Character = map2_dbl(char_pairs, ~sim_character(.x, .y)) ) %>% # 保留需要的列 select(Block_ID, Report_ID_1, Report_ID_2, Similarity_Number, Similarity_Character) print(result)
结果说明
运行后会得到每个Block_ID下所有不重复的Report_ID配对,以及对应的两种相似度值,NA处理逻辑完全符合要求。如果后续需要修改计算规则(比如把数值相似度改成绝对差),只需要调整sim_number函数即可,无需改动整体流程。
内容的提问来源于stack exchange,提问作者Marius
相关产品推荐
相关产品推荐

