如何在fread

时间:2015-09-02 16:36:28

标签: r data.table

我有一个R脚本,可以将几个文本文件读入data.tables。我使用for循环来逐步浏览文件列表以读取每个文件,这非常有用。

dta <- data.table()
for (fname in flist) {
  dt <- data.table(read.csv(fname, header=T, sep=",", comment.char="#"))
  dt$FNAME <- fname
  dta <-rbind(dta,dt)
}

为了加快速度,我决定尝试使用data.table包中的fread方法。我还决定使用grep shell命令来帮助操作,

dta <- data.table()
for (fname in flist) {
  dt <- fread('grep RDIST fname', header=F, sep=",")
  dt$FNAME <- fname
  dta <-rbind(dta,dt)
}

但是我收到了一条错误消息,

grep: fname: No such file or directory
Error in fread("grep RDIST fname", header = F, sep = ",") :
  File is empty: /dev/shm/file2e7efc79ba710d

我认为问题是fread命令没有将fname变量解析为实际的文件名。如果我尝试使用实际的文件名而不是变量,这很有效,

> fname
[1] "QualM_Setall_20150901_165011.txt"
> dt <- fread('grep RDIST QualM_Setall_20150901_165011.txt', sep=',', header=F)
Read 4849664 rows and 15 (of 15) columns from 0.283 GB file in 00:00:04
>

有没有办法让我在fread的shell命令中使用fname作为变量?

谢谢&amp;的问候,

Derric

2 个答案:

答案 0 :(得分:7)

评论太长了。

您正在使用data.table包中非常快的fread(...)函数来导入数据,但您没有利用data.table的其他功能。特别是使用例如向data.table添加列。

dt$newCol <- ...

是不好的做法,因为它会导致R制作新副本。请改用:

dt[,newCol:=...]

这可能比循环更快:

library(data.table)
result <- rbindlist(lapply(flist,function(x)fread(paste("grep RDIST",x),header=FALSE, sep=",")[,FNAME:=x]))

注意:上面的代码是在一个非常简单的情况下测试的。

答案 1 :(得分:1)

end - start

怎么样?
paste