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

如何将多个data.frame列表合并为带来源标识的单个data.frame

解决方法:将列表中的data.frame堆叠并添加来源列

嘿,这个需求其实超容易实现的!我给你分享几种常用的方法,不管你习惯用base R还是tidyverse/data.table,都能快速搞定~

方法1:Base R原生实现

我们可以先给列表里的每个data.frame添加一列标记来源,再用do.call(rbind, ...)合并起来:

# 先定义你的原始列表
list1 <- list(
  df1 = data.frame(bread = c("sourdough","baguette","boule","multigrain"), 
                   cheese = c("parmigiano","cheddar","mozzarella","stilton")),
  df2 = data.frame(bread = c("toast","brioche","focaccia","whole wheat"), 
                   cheese = c("gorgonzola","camembert","gouda","feta"))
)

# 给每个data.frame添加来源列
list_with_source <- Map(function(df, source_name) {
  df$factor <- source_name
  df
}, list1, names(list1))

# 合并为单个data.frame
result_base <- do.call(rbind, list_with_source)
# 把列名"bread"改成你想要的"breads"
names(result_base)[names(result_base) == "bread"] <- "breads"

方法2:用tidyverse的dplyr(最简洁)

dplyr的bind_rows()函数直接支持.id参数,帮你自动添加来源列,一步到位:

library(dplyr)

# 直接堆叠并添加来源列
result_tidy <- bind_rows(list1, .id = "factor")
# 重命名列名
result_tidy <- result_tidy %>% rename(breads = bread)

方法3:用data.table包(适合大数据)

如果你处理的是超大数据集,data.table的效率会更高,用rbindlist()的idcol参数就能实现:

library(data.table)

result_dt <- rbindlist(list1, idcol = "factor")
# 重命名列名
setnames(result_dt, "bread", "breads")

验证结果

不管用哪种方法,最终得到的结果都和你想要的示例完全一致:

> print(result_tidy)
       breads    cheese factor
1  sourdough parmigiano    df1
2   baguette    cheddar    df1
3      boule mozzarella    df1
4 multigrain    stilton    df1
5       toast  gorgonzola    df2
6     brioche   camembert    df2
7    focaccia       gouda    df2
8 whole wheat        feta    df2

内容的提问来源于stack exchange,提问作者Dasr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:47:35