объединить много CSV-файлов с различными столбцами и заголовками в R - PullRequest
0 голосов
/ 04 апреля 2020

У меня сложная проблема, и я ценю любые советы. У меня есть около 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))

Идентификационный код уникален для каждой строки, поскольку он включает год и другие факторы. Так что для этого примера я хочу один файл с 15 строками для каждого ID_code и всех столбцов (вещи, вещи и дополнения). Как мне объединить все файлы в списке и установить заголовки всех столбцов в нижний регистр, чтобы R не думал, что «вещи» и «вещи» - это разные столбцы?

1 Ответ

0 голосов
/ 04 апреля 2020

Мы можем получить все наборы данных, начинающиеся с dat и заканчивающиеся цифрами (\\d+) в list (mget), изменив имена столбцов на строчные (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))
...