【问题标题】:merge many csv files with different columns and headers in R在 R 中合并许多具有不同列和标题的 csv 文件
【发布时间】:2020-07-16 04:09:08
【问题描述】:

我有一个复杂的问题,感谢任何建议。我有大约 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 不认为“事物”和“事物”是不同的列?

【问题讨论】:

    标签: r list csv merge lowercase


    【解决方案1】:

    我们可以将所有以dat开头并以数字结尾(\\d+)的数据集变成listmget),将列名更改为小写(tolower),merge他们在Reduce

    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))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-10-10
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-04
      • 2021-06-15
      • 2019-01-16
      相关资源
      最近更新 更多