如何将多个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
相关产品推荐
相关产品推荐

