如何使用 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
而不是普通的 map
。 map_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)
我是 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
而不是普通的 map
。 map_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)