合并许多具有R中不同列和标题的csv文件

时间:2020-04-03 22:13:59

标签: r list csv merge lowercase

我有一个复杂的问题,感谢任何建议。我有大约100个csv文件,它们对应于我作为列表带入R中的不同年份的数据收集。我需要合并它们,但是文件并不全都具有相同的列数,列的顺序也不相同,并且某些列标题为大写,而另一些则为小写。这是列表中数据集的简化示例:

ID_code = c(1,2,3,4,5)
stuff = sample(x = c("A", "B", "C"), size = 5, replace = TRUE)
THINGS = sample(x = c(5, 10, 27), size = 5, replace = TRUE)
extras = rnorm(5, mean=0)
dat1 = as.data.frame(cbind(ID_code, stuff, THINGS, extras))

ID_code = c(6,7,8,9,10)
THINGS = sample(x = c(5, 10, 27), size = 5, replace = TRUE)
stuff = sample(x = c("A", "B", "C"), size = 5, replace = TRUE)
dat2 = as.data.frame(cbind(ID_code, THINGS, stuff))

ID_code = c(11,12,13,14,15)
EXTRAS = rnorm(5, mean=0)
stuff = sample(x = c("A", "B", "C"), size = 5, replace = TRUE)
things = sample(x = c(5, 10, 27), size = 5, replace = TRUE)
dat3 = as.data.frame(cbind(ID_code, EXTRAS, stuff, things))

ID_code对于每一行都是唯一的,因为它包含年份和其他因素。因此,对于此示例,我想要一个文件,其中每个ID_code和所有列(东西,东西和其他内容)都有15行。我如何合并列表中的所有文件并将所有列标题设置为小写,以使R认为“事物”和“事物”不是不同的列?

1 个答案:

答案 0 :(得分:0)

我们可以获取所有以dat开头,以数字(\\d+结尾的数据集为listmget),将列名更改为小写( tolower),mergeReduce

Reduce(function(...) merge(..., all = TRUE),
        lapply(mget(ls(pattern = '^dat\\d+$')), 
     function(x) setNames(x, tolower(names(x)))))

或者可能是bind_rows

library(dplyr)
library(purrr)
mget(ls(pattern = '^dat\\d+$')) %>%
      map_dfr(~ .x %>%
                rename_all(tolower))