R语言中如何提取跨行重复的行内元素三元组并生成匹配结果表
R 跨记录重复行内三元组提取实现
核心处理逻辑
- 逐行提取A/B/C/D列所有可能的三元素无顺序组合,提前对行内元素排序,避免相同集合因列位置差异被识别为不同三元组
- 统计每个三元组的全局出现频次,仅保留出现次数≥2的三元组(即至少在两条不同记录中出现)
- 将筛选后的三元组关联所属原记录信息,按要求的列顺序整理输出结果
可直接运行的代码实现
# 加载依赖包 library(tidyverse) library(gtools) # 构造原始测试数据集 raw_df <- tibble( DOC = c("Doc1", "Doc2", "Doc3", "Doc4"), A = c("apple", "apple", "apple", "banana"), B = c("berry", "banana", "banana", "berry"), C = c("coconut", "berry", "berry", "pear"), D = c("pear", "prune", "coconut", "prune") ) # 核心处理流程 result_df <- raw_df |> # 逐行提取三元组 rowwise() |> mutate( sorted_vals = list(c_across(A:D) |> sort()), trios = list(combinations(sorted_vals, m = 3) |> as.data.frame()) ) |> ungroup() |> # 展开三元组为长表 unnest(trios) |> # 生成格式化的Trio标识 mutate(Trio = paste(V1, V2, V3, sep = ", ")) |> # 筛选跨记录重复的三元组 group_by(Trio) |> filter(n() >= 2) |> ungroup() |> # 调整列顺序匹配输出结构 select(DOC, Trio, A:D)
实现细节说明
- 提取三元组阶段对行内元素做升序排列,消除列位置对三元组匹配的干扰:相同的三个元素无论分布在原行的哪几列,只要集合构成一致,就会生成完全相同的Trio字符串,不会出现同组元素被拆成不同三元组的识别偏差
- 分组过滤的规则直接匹配核心需求:统计每个Trio的出现行数,只要行数≥2,就说明该三元组至少在两条独立记录中出现,不需要额外做“是否和其他行匹配”的交叉校验
- 最终输出表完全保留原数据集的DOC、A、B、C、D列内容,仅新增Trio列标记当前行匹配到的具体三元组,和示例输出结构完全对齐
内容的提问来源于stack exchange,提问作者GPD
相关产品推荐
相关产品推荐

