You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:42:43