Как эффективно читать и связывать все файлы .xlsx в папке, используя read_excel - PullRequest
1 голос
/ 07 ноября 2019

Я новичок в R и мне нужно создать один фрейм данных из 80 файлов .xlsx, которые в основном имеют одинаковые столбцы и находятся в одной папке. Я хочу эффективно связать все эти файлы таким образом, чтобы они работали, если бы я позже добавил или удалил файлы из папки. Я хочу сделать это без преобразования файлов в .csv, если кто-то не может показать мне, как это эффективно для большого числа файлов в самой R.

Ранее я читал файлы по отдельности, используя read_excelфункция из пакета readxl. После этого я бы использовал rbind, чтобы связать их. Это было хорошо для 10 файлов, но не для 80! Я экспериментировал со многими решениями, предлагаемыми онлайн, однако ни одно из них, похоже, не работает, в основном потому, что они используют функции, отличные от read_excel, или форматы, отличные от .xlsx. Я не отслеживал многие из моих неудачных попыток, поэтому не могу предложить код, отличный от одного альтернативного метода, который я пытался адаптировать к read_excel из функции read_csv.

#Method 1
library(readxl)
library(purr)
library(dplyr)
library(tidyverse)
file.list <- list.files(pattern='*.xlsx')
alldata <- file.list %>%
map(read_excel) %>%
reduce(rbind)

#Output
New names:
* `` -> ...2
Error in rbind(deparse.level, ...) : 
numbers of columns of arguments do not match

Любой код о том, как это сделать, будет принят с благодарностью. Извините, если что-то не так с этим постом, это мой первый.

ОБНОВЛЕНИЕ: Используя изменения, предложенные ответами, я сейчас использую код:

file.list <- list.files(pattern='*.xlsx')
alldata <- file.list %>%
map_dfr(read_excel) %>%
reduce(bind_rows)

Этот выводТеперь это выглядит следующим образом:

New names:
* `` -> ...2
Error: Column `10.Alert.alone` can't be converted from numeric to character

Это происходит независимо от того, какой тип функции bind() я использую в слоте reduce(). Если кто-то может помочь с этим, пожалуйста, дайте мне знать!

Ответы [ 3 ]

0 голосов
/ 07 ноября 2019

Вы на правильном пути здесь. Но вам нужно использовать map_dfr вместо простого ванили map. map_dfr выводит фрейм данных (или фактически тиббл) для каждой итерации и объединяет их с помощью bind_rows.

Это должно работать:

library(readxl)
library(tidyverse)
file.list <- list.files(pattern='*.xlsx')
alldata <- file.list %>%
  map_dfr(~read_excel(.x))

Обратите внимание, что это предполагает, что ваши файлы всеиметь согласованные имена столбцов и типы данных. Если они этого не делают, вам, возможно, придется сделать уборку. (Один из приемов, которые я использовал в сложных случаях, - это добавить %>% mutate_all(as.character) к команде read_excel внутри функции карты. Это превратит everything в символы, а затем вы сможете конвертировать типы данных изесть.)

0 голосов
/ 07 ноября 2019

Попробуйте использовать map_dfr.

alldata <- file.list %>%
map_dfr(read_excel)
0 голосов
/ 07 ноября 2019

это должно привести вас туда / закрыть ...

library(data.table)
library(readxl)
#create files list
file.list <- list.files( pattern = ".*\\.xlsx$", full.names = TRUE )
#read files to list of data.frames
l <- lapply( l, readxl::read_excel )
#bind l together to one larger data.table, by columnname, fill missing with NA 
dt <- data.table::rbindlist( l, use.names = TRUE, fill = TRUE )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...