使用data.table快速读取和组合多个文件(带有fread)

Big*_*hao 31 r fread data.table

我有几个不同的txt文件具有相同的结构.现在我想用fread将它们读入R,然后将它们组合成一个更大的数据集.

## First put all file names into a list 
library(data.table)
all.files <- list.files(path = "C:/Users",pattern = ".txt")

## Read data using fread
readdata <- function(fn){
    dt_temp <- fread(fn, sep=",")
    keycols <- c("ID", "date")
    setkeyv(dt_temp,keycols)  # Notice there's a "v" after setkey with multiple keys
    return(dt_temp)

}
# then using 
mylist <- lapply(all.files, readdata)
mydata <- do.call('rbind',mylist)
Run Code Online (Sandbox Code Playgroud)

代码工作正常,但速度不理想.每个txt文件有1M个观察值和12个字段.

如果我用它fread来读取单个文件,那就快了.但是使用apply,那么速度非常慢,显然比逐个读取文件需要花费很多时间.我想知道这里出了什么问题,速度提升有什么改进吗?

我试图llplyplyr包中,有是没有太大的速度上涨.

此外,是否有任何语法data.table实现垂直连接喜欢rbindunionin sql

谢谢.

Sim*_*lon 45

使用rbindlist()被设计为rbind一个listdata.table我们一起...

mylist <- lapply(all.files, readdata)
mydata <- rbindlist( mylist )
Run Code Online (Sandbox Code Playgroud)

正如@Roland所说,不要在函数的每次迭代中设置键!

总而言之,这是最好的:

l <- lapply(all.files, fread, sep=",")
dt <- rbindlist( l )
setkey( dt , ID, date )
Run Code Online (Sandbox Code Playgroud)

  • 另外,最后只设置一次键. (4认同)