基于公共元素分组 将向量合并为排序字符串的R语言技术问询
解决思路与代码实现
问题本质
这是典型的连通分量识别问题:两列中存在关联(同一行的两个元素,或通过其他元素间接关联)的元素属于同一个分组,我们可以借助图论工具高效识别这些分组,再完成合并排序。
实现步骤与代码
1. 加载依赖包
需要用到tidyverse处理数据,igraph处理图结构:
install.packages(c("tidyverse", "igraph")) library(tidyverse) library(igraph)
2. 原始输入数据
df <- tibble::tribble( ~col1, ~col2, "a", "b", "b","c", "c","b", "d",NA, "e","d", "f","d", "g","d", "h","i", "i","h", "j", NA )
3. 提取边并构建图
去掉包含NA的行(无连接关系),用有效行作为图的边创建无向图,识别连通分量:
# 提取有效边数据 edges <- df %>% filter(!is.na(col2)) %>% select(col1, col2) # 创建无向图并获取连通分量信息 graph <- graph_from_data_frame(edges, directed = FALSE) component_info <- components(graph)
4. 分配元素到对应分组
收集所有出现过的元素,给每个元素分配分组ID:属于连通分量的用组件ID,无关联的单独元素分配新ID:
# 收集所有唯一元素(剔除NA) all_elements <- df %>% pivot_longer(cols = everything(), values_to = "element") %>% filter(!is.na(element)) %>% pull(element) %>% unique() # 为每个元素分配分组ID element_groups <- tibble(element = all_elements) %>% mutate(group_id = case_when( element %in% names(component_info$membership) ~ component_info$membership[element], TRUE ~ max(component_info$membership) + row_number() ))
5. 分组合并排序
对每个分组的元素排序后,用下划线连接成字符串:
# 生成最终结果 result <- element_groups %>% group_by(group_id) %>% summarize(result = str_c(sort(element), collapse = "_")) %>% select(result) # 查看结果 print(result)
输出结果
运行后得到的结果与期望完全一致:
# A tibble: 4 × 1 result <chr> 1 a_b_c 2 d_e_f_g 3 h_i 4 j
内容的提问来源于stack exchange,提问作者eule83
相关产品推荐
相关产品推荐

