为合并后的DataFrame添加原数据框名称列
解决方案
要实现给合并后的unlisted新增dataname列记录原DataFrame名称的需求,核心是先给存储DataFrame的列表命名,再为每个子DataFrame添加标识列,最后按原流程合并,具体实现如下:
方法一:基础R原生实现
- 给列表命名:创建列表时直接指定每个元素的名称(对应原DataFrame的名字)
- 批量添加标识列:用
Map函数遍历列表,给每个子DataFrame新增dataname列并赋值为对应列表元素的名称 - 合并数据:用
do.call(rbind, ...)完成合并
set.seed(1) d.A.100 = data.frame(x=runif(10), y = runif(10)) d.A.200 = data.frame(x=runif(10), y = runif(10)) d.B.100 = data.frame(x=runif(10), y = runif(10)) d.B.200 = data.frame(x=runif(10), y = runif(10)) # 关键:给列表的每个元素命名,对应原DataFrame的名称 mylist = list(d.A.100 = d.A.100, d.A.200 = d.A.200, d.B.100 = d.B.100, d.B.200 = d.B.200) # 给每个子DataFrame添加dataname列 mylist_with_label <- Map(function(df, df_name) { df$dataname <- df_name df }, mylist, names(mylist)) # 按原流程合并 unlisted = do.call(rbind, mylist_with_label)
方法二:简化的基础R实现
如果不想用Map,也可以用lapply结合列表名称批量处理:
# 基于已命名的mylist mylist_with_label <- lapply(names(mylist), function(n) { cbind(mylist[[n]], dataname = n) }) unlisted = do.call(rbind, mylist_with_label)
验证结果
合并后查看unlisted的前几行,能看到dataname列正确标识了每行数据的来源:
head(unlisted)
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

