我有几个结构相同的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)
代码可以正常运行,但速度不太令人满意。每个txt文件有1M观测值和12个字段。
如果我使用fread
读取单个文件,速度很快。但是使用apply
后,速度非常慢,明显比一个一个地读取文件花费更多的时间。我想知道出了什么问题,在这里是否有任何提高速度的改进方法?
我尝试了plyr
包中的llply
,但没有多少速度提升。
此外,data.table
中是否有类似于sql
中的rbind
和union
的语法来实现垂直连接?
谢谢。
for
或lapply
的计算开销还是读取1e6
个数据观测值的开销?在这种情况下,这完全是任意的。我认为使用for
循环可能会更好地管理内存,而且它肯定不比lapply
差。两者之间没有速度差异。 - Simon O'Hanlonlist.files()
中添加full.names = TRUE
,例如list.files(path = "C:/Users",pattern = ".txt",full.names=TRUE)
。这将附加完整的文件路径到每个被调用的文件,使得lapply
函数能够成功地定位和操作每个文件。 - TheSciGuy