如何在fread中指定变量filename

Der*_*wis 3 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)
}
Run Code Online (Sandbox Code Playgroud)

为了加快速度,我决定尝试使用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)
}
Run Code Online (Sandbox Code Playgroud)

但我收到一条错误消息,

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

我认为问题是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
>
Run Code Online (Sandbox Code Playgroud)

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

感谢和问候,

Derric

jlh*_*ard 7

评论太久了.

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

dt$newCol <- ...
Run Code Online (Sandbox Code Playgroud)

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

dt[,newCol:=...]
Run Code Online (Sandbox Code Playgroud)

这可能比循环更快:

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

注意:上面的代码在一个非常简单的情况下进行了测试.