如何使用 read_excel 有效地读取和绑定文件夹中的所有 .xlsx 文件

How to read and rbind all .xlsx files in a folder efficiently using read_excel

我是 R 的新手,需要从 80 个 .xlsx 文件创建一个数据框,这些文件大多共享相同的列并且都在同一个文件夹中。我想有效地绑定所有这些文件,如果我稍后从文件夹中添加或删除文件,这种方式将有效。我想在不将文件转换为 .csv 的情况下执行此操作,除非有人可以告诉我如何在 R 本身中有效地处理大量文件。

我以前一直使用 readxl 包中的 read_excel 函数单独读取文件。之后,我会使用 rbind 来绑定它们。这对 10 个文件没问题,但对 80 个文件就不行了!我尝试过许多在线提供的解决方案,但其中 none 似乎有效,主要是因为它们使用的是 read_excel 以外的功能或 .xlsx 以外的格式。我没有跟踪我的许多失败尝试,因此除了我尝试从 read_csv 函数适应 read_excel 的一种替代方法外,无法提供代码。

#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

任何有关如何执行此操作的代码将不胜感激。对不起,如果这个 post 有任何问题,这是我的第一个。

更新: 使用答案建议的更改,我现在使用代码:

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

无论我在 reduce() 槽中使用哪种类型的 bind() 函数,都会发生这种情况。如果有人可以帮助解决这个问题,请告诉我!

这应该让你 there/close...

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 )

你走在正确的轨道上。但是你需要使用 map_dfr 而不是普通的 mapmap_dfr 为每次迭代输出一个数据帧(或实际上是 tibble),并通过 bind_rows.

组合它们

这应该有效:

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

请注意,这假设您的文件都具有一致的列名和数据类型。如果他们不这样做,您可能需要做一些清洁工作。 (我在复杂情况下使用的一个技巧是在 map 函数内的 read_excel 命令中添加 %>% mutate_all(as.character)。这会将 everything 转换为字符,并且然后你可以从那里转换数据类型。)

尝试使用 map_dfr。

alldata <- file.list %>%
map_dfr(read_excel)