如何对多个tibble按唯一索引全连接并合并非匹配列值为列表
多Tibble按唯一索引全连接并合并同名列值为列表的解决方案
问题说明
需要将2个及以上列名一致的tibble,按含唯一索引的列(如id)执行全连接,保留原列名,并将对应列的非相同值合并为向量/列表。dplyr::full_join会将同名列拆分为.x/.y后缀的新列,无法满足需求。
示例输入
library(tibble) a <- tibble::tribble( ~id, ~name, ~location, 1, 'Caspar', 'NL', 2, 'Monica', 'USA', 3, 'Martin', 'DE' ) b <- tibble::tribble( ~id, ~name, ~location, 1, 'Caspar', 'WWW', 2, 'Monique', 'USA', 4, 'Francis', 'FR' )
解决方案
1. 两个Tibble的处理
通过bind_rows合并所有行,再按索引列分组,将每组内的列值收集为去重后的列表:
library(dplyr) bind_rows(a, b) %>% group_by(id) %>% summarise( across(everything(), ~ list(unique(na.omit(.x)))), .groups = "drop" )
2. 多个Tibble的通用处理
将所有tibble放入列表,用相同逻辑批量处理,支持任意数量的输入:
library(purrr) library(dplyr) # 将所有tibble存入列表(可添加更多) tibble_list <- list(a, b) tibble_list %>% bind_rows() %>% group_by(id) %>% summarise( across(everything(), ~ list(unique(na.omit(.x)))), .groups = "drop" )
输出结果说明
执行后会得到如下结构的tibble(以示例输入为例):
| id | name | location |
|---|---|---|
| 1 | ["Caspar"] | ["NL", "WWW"] |
| 2 | ["Monica", "Monique"] | ["USA"] |
| 3 | ["Martin"] | ["DE"] |
| 4 | ["Francis"] | ["FR"] |
每个列的取值为列表,包含对应id在所有输入tibble中的去重非空值,完全保留原列名,符合需求。
内容的提问来源于stack exchange,提问作者Caspar V.
相关产品推荐
相关产品推荐

