如何将多个(Excel)文件读入R?

52

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

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

1个回答

113
使用list.files函数可以创建一个包含工作目录中所有文件名的列表。接下来,您可以使用lapply函数循环遍历该列表,并使用readxl软件包中的read_excel函数读取每个文件。请注意保留HTML标签。
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文件的其他可能包括:openxlsxxlsx


假设每个文件的列都相同,您可以使用中的bind_rows将它们绑定到一个数据框中:
library(dplyr)
df <- bind_rows(df.list, .id = "id")

或者使用 中的 rbindlist:
library(data.table)
df <- rbindlist(df.list, idcol = "id")

两者都可以选择添加一个id列来标识不同的数据集。


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

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

使用 中的 bind_rows 中的 rbindlist 时,id列现在包含文件名。
甚至可以使用 purrr 包中的另一种方法:
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列现在将包含文件名而不是数字标识符。

具有两个函数的程序包,可以读取一种类型的文件,Hadley这次做得非常出色。 - rawr
在R中工作可以非常优雅...这确实是一种干净简单的方法。然而,不幸的是我正在与这个错误挣扎:[链接](https://github.com/hadley/readxl/issues/80),所以我可能必须使用(更)慢的`read.xlsx`函数...这有点麻烦。话虽如此:有没有一种方法可以将xlsx转换为.csv而不需要逐个打开和保存每个文件? - Manuel R
1
read.xlsx 可能会慢一些,但这是一个你可以并行运行的过程,只要所有核心都在本地机器上(或者有访问相同共享目录的权限)。这至少可以弥补一些时间损失。注意:我以前没有尝试过并行读取文件,但我认为它应该可以工作——只要所有核心都在同一台机器上。 - Benjamin
@ManuelS 作为替代方案,您可以使用openxlsx中的read.xlsx函数,而不是xlsx包中的read.xlsx函数。 - Jaap
1
@user177196,“list.files”函数有一个“path”参数,您可以使用它来指定要搜索文件的目录;请参见“?list.files”。 - Jaap
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接