合并数据框列表并提取行索引为新列的实现方法
问题与解决方案:合并数据框列表时保留所有行与行索引
问题背景
现有一个包含3个数据框的列表my_list,每个数据框的行索引对应文件名:
my_list <- list(structure(list(observations = c(1L, 5L), variables = c(4L, 8L)), class = "data.frame", row.names = c("asp_202003...Copy.xlsx", "asp_202003.xlsx")), structure(list(observations = c(3L, 1L), variables = 5:4), class = "data.frame", row.names = c("eay_201008_a.xlsx", "eay_202003.xlsx")), structure(list(observations = 3:4, variables = c(4L, 6L)), class = "data.frame", row.names = c("wana_202309...Copy.xlsx", "wana_202309.xlsx")))
使用reduce(full_join)合并时:
my_merge <- my_list %>% reduce(full_join)
出现两个问题:
- 原6行数据合并后仅剩5行,重复行被自动合并
- 原数据框的行索引(文件名)未被保留
需求:合并后保留全部6行数据,同时将原行索引提取为名为file的新列。
解决方案
不需要用full_join(它是按列匹配合并的逻辑),而是用map_dfr遍历每个数据框,先将行索引转为file列,再行绑定所有数据框:
library(tidyverse) my_merge <- my_list %>% map_dfr(~ .x %>% rownames_to_column(var = "file"))
输出结果
运行后得到的结果包含全部6行,且保留了每个数据的文件名:
# A tibble: 6 × 3 file observations variables <chr> <int> <int> 1 asp_202003...Copy.xlsx 1 4 2 asp_202003.xlsx 5 8 3 eay_201008_a.xlsx 3 5 4 eay_202003.xlsx 1 4 5 wana_202309...Copy.xlsx 3 4 6 wana_202309.xlsx 4 6
内容的提问来源于stack exchange,提问作者johnjohn
相关产品推荐
相关产品推荐

