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

如何对多个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(以示例输入为例):

idnamelocation
1["Caspar"]["NL", "WWW"]
2["Monica", "Monique"]["USA"]
3["Martin"]["DE"]
4["Francis"]["FR"]

每个列的取值为列表,包含对应id在所有输入tibble中的去重非空值,完全保留原列名,符合需求。

内容的提问来源于stack exchange,提问作者Caspar V.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 04:57:24