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

在R中基于字符串组合值筛选行:保留重叠值组的唯一行

解决R语言中基于重叠值分组并保留组内单行的问题

你的需求本质是识别连通分量——只要两行的overlap值存在交集,就归为同一组,最终每组保留一行。以下是针对行长度不一致场景的可行方案:

实现思路

把每行看作一个节点,若两行的overlap值有共同元素则节点间连边,最终每个连通分量就是一组。用图论工具可以高效处理这种跨行的重叠关联,完全适配行长度不一致的情况。

完整代码

# 安装并加载igraph包(用于处理连通分量)
if (!require(igraph)) install.packages("igraph")
library(igraph)

# 原始数据
df <- data.frame(overlap = c("1,2,3", "1,2,3", "1,2,3,4", "3,4", 
                              "5,6", "5,6,7", "6,7", 
                              "8,9", "8,9,10", "9,10", 
                              "11,12,13", "11,12,13", 
                              "11,12,13,14", "13,14", 
                              "15,16", "15,16,17", "16,17", 
                              "18,19", "18,19,20", "19,20"))

# 1. 将逗号分隔的字符串拆分为数值向量列表
overlap_list <- strsplit(df$overlap, ",") |> lapply(as.numeric)

# 2. 构建邻接矩阵:标记两行是否存在重叠值
n_rows <- nrow(df)
adj_matrix <- matrix(FALSE, nrow = n_rows, ncol = n_rows)
for (i in 1:n_rows) {
  for (j in i:n_rows) {
    # 只要有交集就标记为连通
    adj_matrix[i,j] <- adj_matrix[j,i] <- length(intersect(overlap_list[[i]], overlap_list[[j]])) > 0
  }
}

# 3. 用igraph识别连通分量,给每行分配组ID
g <- graph_from_adjacency_matrix(adj_matrix, mode = "undirected")
components <- components(g)
df$group_id <- components$membership

# 4. 按组分组,保留每组第一行(可按需修改保留规则)
result <- df |> 
  dplyr::group_by(group_id) |> 
  dplyr::slice_head(n = 1) |> 
  dplyr::ungroup() |> 
  dplyr::select(overlap)

# 输出结果
print(result)

自定义保留规则

如果不想保留每组第一行,可替换slice_head为其他规则:

  • 保留组内值最多的行:dplyr::slice_max(n = 1, order_by = stringr::str_length(overlap))
  • 保留组内特定行:根据实际需求添加筛选条件即可

内容的提问来源于stack exchange,提问作者bcrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 03:49:59