【发布时间】:2015-12-29 13:51:09
【问题描述】:
我有数百个中等大小的 Excel 文件(5000 到 50.0000 行,大约 100 列)要加载到 R 中。它们具有明确定义的命名模式,例如 x_1.xlsx、x_2.xlsx 等。
如何以最快、最直接的方式将这些文件加载到 R 中?
【问题讨论】:
我有数百个中等大小的 Excel 文件(5000 到 50.0000 行,大约 100 列)要加载到 R 中。它们具有明确定义的命名模式,例如 x_1.xlsx、x_2.xlsx 等。
如何以最快、最直接的方式将这些文件加载到 R 中?
【问题讨论】:
使用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 列现在将包含文件名而不是数字标识符。
【讨论】:
readr 包中
read.xlsx 函数......这有点痛苦。话虽如此:有没有一种方法可以将 xlsx 转换为 .csv 而无需逐个打开和保存每个文件?
read.xlsx 可能会更慢,但这是一个您可以并行运行的过程,只要所有内核都在本地计算机上(或者可以访问相同的共享目录,也许)。这至少可以弥补一些失去的时间。警告:我之前没有尝试过并行读取文件,但没有看到它不应该工作的原因 - 再次,只要所有内核都在同一台机器上。
openxlsx-package 中的read.xlsx 函数,而不是xlsx-package 中的read.xlsx 函数。