如何将多个(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.xlsx
、x_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.csv
或read.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
列来识别单独的数据集。
更新:如果您不想要数字标识符,只需使用sapply
和simplify = 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 中的 rbindlist
或 dplyr 中的 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? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
java jxls导入excel 的多个sheet 代码该如何写 配置文件怎么写? 还有jxls 能读入07 excel吗?