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

如何高效连接键为列表格式的两个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)

输出结果完全符合预期:

A1A2B1
c("a")1c("apple")
c("a","b")2c("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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.17 12:36:03