如何将多个(excel)文件读入R? [复制]

Posted

技术标签:

【中文标题】如何将多个(excel)文件读入R? [复制]【英文标题】:How can I read multiple (excel) files into R? [duplicate] 【发布时间】:2015-12-29 13:51:09 【问题描述】:

我有数百个中等大小的 Excel 文件(5000 到 50.0000 行,大约 100 列)要加载到 R 中。它们具有明确定义的命名模式,例如 x_1.xlsxx_2.xlsx 等。

如何以最快、最直接的方式将这些文件加载​​到 R 中?

【问题讨论】:

【参考方案1】:

使用list.files,您可以创建工作目录中所有文件名的列表。接下来,您可以使用lapply 循环遍历该列表并使用readxl 包中的read_excel 函数读取每个文件:

library(readxl)
file.list <- list.files(pattern='*.xlsx')
df.list <- lapply(file.list, read_excel)

此方法当然也可以与read.csvread.table 等其他文件读取功能一起使用。只需将read_excel 替换为适当的文件读取功能,并确保在list.files 中使用正确的模式。

如果您还想将文件包含在子目录中,请使用:

file.list <- list.files(pattern='*.xlsx', recursive = TRUE)

其他可能的读取 Excel 文件的软件包:openxlsx & xlsx


假设每个文件的列都相同,您可以将它们绑定到一个数据框中,使用来自dplyr 的bind_rows

library(dplyr)
df <- bind_rows(df.list, .id = "id")

或与rbindlist 来自data.table:

library(data.table)
df <- rbindlist(df.list, idcol = "id")

两者都可以选择添加id 列来识别单独的数据集。


更新:如果您不想要数字标识符,只需使用sapplysimplify = FALSE 来读取file.list 中的文件:

df.list <- sapply(file.list, read.csv, simplify=FALSE)

当使用来自dplyr 的bind_rows 或来自data.table 的rbindlist 时,id 列现在包含文件名。

甚至另一种方法是使用purrr-package:

library(purrr)
file.list <- list.files(pattern='*.csv')
file.list <- setNames(file.list, file.list) # only needed when you need an id-column with the file-names

df <- map_df(file.list, read.csv, .id = "id")

获取命名列表的其他方法:如果您不想要一个数字标识符,则可以在将它们绑定在一起之前将文件名分配给列表中的数据框。有几种方法可以做到这一点:

# with the 'attr' function from base R
attr(df.list, "names") <- file.list
# with the 'names' function from base R
names(df.list) <- file.list
# with the 'setattr' function from the 'data.table' package
setattr(df.list, "names", file.list)

现在您可以使用 data.table 中的 rbindlistdplyr 中的 bind_rows 将数据帧列表绑定到一个数据帧中。 id 列现在将包含文件名而不是数字标识符。

【讨论】:

具有读取一种文件的两个函数的包,哈德利这次肯定超越了自己。 @rawr 确实,例如,他可以将其集成到他的 readr 包中 在 R 中工作可以如此优雅......这确实是一种干净而简单的方法。然而,不幸的是,我正在努力解决这个错误:[link] (github.com/hadley/readxl/issues/80) 所以我可能不得不使用(非常)慢的read.xlsx 函数......这有点痛苦。话虽如此:有没有一种方法可以将 xlsx 转换为 .csv 而无需逐个打开和保存每个文件? read.xlsx 可能会更慢,但这是一个您可以并行运行的过程,只要所有内核都在本地计算机上(或者可以访问相同的共享目录,也许)。这至少可以弥补一些失去的时间。警告:我之前没有尝试过并行读取文件,但没有看到它不应该工作的原因 - 再次,只要所有内核都在同一台机器上。 @ManuelS 作为替代方案,您可以使用openxlsx-package 中的read.xlsx 函数,而不是xlsx-package 中的read.xlsx 函数。

以上是关于如何将多个(excel)文件读入R? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将多个csv按行合并?(不是首尾相接的按列合并)

如何将EXCEL中的多个表格复制到另一个表格中

java jxls导入excel 的多个sheet 代码该如何写 配置文件怎么写? 还有jxls 能读入07 excel吗?

如何将多个excel文件合并?

将文件夹中的多个csv文件读入R中的单个数据框[重复]

linux中怎么将文件合并