如何高效连接键为列表格式的两个R语言数据框?
解决方案
这里提供两种适配你需求的实现方式,均支持A1列长度0到5的场景:
方案1:长表拆合实现(易排查、适配复杂逻辑)
核心思路是先把列表列拆为单行单键的长格式,完成连接后再聚合回列表,逻辑直观易调试:
library(tidyverse) # 原始数据 table_A <- tibble(A1 = c("a", "a/b"), A2 = seq(1,2)) %>% mutate(A1 = str_split(A1, "/")) table_B <- tibble(A1 = c("a","b"), B1 = c("apple", "bananas")) # 实现代码 table_A_result <- table_A %>% mutate(row_id = row_number()) %>% # 标记原始行号,用于聚合 unnest_longer(A1) %>% # 拆分列表列为长表 left_join(table_B, by = "A1") %>% # 常规左连匹配B1 group_by(row_id, A2) %>% # 按原始行分组 summarise( A1 = list(A1), B1 = list(na.omit(B1)), # 聚合B1为列表,自动过滤空匹配 .groups = "drop" ) %>% select(-row_id)
输出结果完全符合预期:
| A1 | A2 | B1 |
|---|---|---|
| c("a") | 1 | c("apple") |
| c("a","b") | 2 | c("apple","bananas") |
方案2:purrr遍历实现(代码更简洁)
如果仅需要匹配生成B1列,不需要处理拆分后的中间数据,可以直接遍历A1列表元素匹配取值,代码更短:
table_A_result <- table_A %>% mutate(B1 = map(A1, ~ table_B$B1[table_B$A1 %in% .x]))
方案选型建议
- 需要对拆分后的A1做其他清洗、计算操作,选方案1
- 仅需生成B1列、数据量不大,选方案2
内容的提问来源于stack exchange,提问作者Mojjouaye
相关产品推荐
相关产品推荐

