在for循环中读取R中的大型csv文件
read large csv files in R inside for loop
为了加速我正在设置 colClasses,我的读取文件如下所示:
readfile=function(name,save=0, rand=1)
{
data=data.frame()
tab5rows <- read.table(name, header = TRUE, nrows = 5,sep=",")
classes <- sapply(tab5rows, class)
data <- read.table(pipe(paste("cat",name,"| ./myscript.sh",rand)), header = TRUE, colClasses = classes,sep=",")
if(save==1)
{
out=paste(file,"Rdata",sep=".")
save(data,file=out)
}
else
{
data
}
}
myscipt.sh 的内容:
#!/bin/sh
awk -v prob="" 'BEGIN {srand()} {if(NR==1)print [=11=]; else if(rand() < prob) print [=11=];}'
作为对此的扩展,我需要增量读取文件。比如说,如果文件在 10:am 处有 10 行,在 11:am 处有 100 行,我需要那些新添加的 90 行 + header(没有它我将无法实施进一步的 R 处理) 我使用命令对 readfile 函数进行了更改:
data <- read.table(pipe(paste("(head -n1 && tail -n",skip,")<",name,"| ./myscript.sh",rand)), header = TRUE, colClasses = classes,sep=",")
这里 skip 给出了要拖尾的行数(由其他脚本计算,假设我已经有了这些)。我将这个函数称为 readfileIncrementally。
abcd 是 csv 文件,每个文件有 18 列。现在我 运行 这个里面的 for 循环说 for i in a b c d
a,b,c,d 是 4 个具有不同 skip 值的文件。假设 a 为 skip=10,000,b 为 20,000。如果我单独 运行 这些(不在 for 循环中),它 运行 没问题。但是在循环的情况下它给我错误扫描行 "n" 没有 18 列。通常当跳过值大于 3000(大约)时会发生这种情况。
但是我交叉检查了没有。使用命令 awk -F "," 'NF != 18' ./a.csv
的列数肯定有 18 列。
对我来说这似乎是一个时间问题,有什么方法可以在转到下一个文件之前给 R 所需的时间。或者有什么我想念的。 运行单独 运行 没问题(虽然需要几秒钟)。
data <- read.table(pipe(paste("(head -n1 && tail -n",skip," | head " as.integer(skip)-1")<",name,"| ./myscript.sh",rand)), header = TRUE, colClasses = classes,sep=",")
对我有用。基本上,在 R 读取文件时,最后一行还没有完全写入。因此显示第 n 行没有 18 列的错误。让它少读 1 行对我来说很好。
除此之外,我没有找到任何 R 功能来克服这种情况。
为了加速我正在设置 colClasses,我的读取文件如下所示:
readfile=function(name,save=0, rand=1)
{
data=data.frame()
tab5rows <- read.table(name, header = TRUE, nrows = 5,sep=",")
classes <- sapply(tab5rows, class)
data <- read.table(pipe(paste("cat",name,"| ./myscript.sh",rand)), header = TRUE, colClasses = classes,sep=",")
if(save==1)
{
out=paste(file,"Rdata",sep=".")
save(data,file=out)
}
else
{
data
}
}
myscipt.sh 的内容:
#!/bin/sh
awk -v prob="" 'BEGIN {srand()} {if(NR==1)print [=11=]; else if(rand() < prob) print [=11=];}'
作为对此的扩展,我需要增量读取文件。比如说,如果文件在 10:am 处有 10 行,在 11:am 处有 100 行,我需要那些新添加的 90 行 + header(没有它我将无法实施进一步的 R 处理) 我使用命令对 readfile 函数进行了更改:
data <- read.table(pipe(paste("(head -n1 && tail -n",skip,")<",name,"| ./myscript.sh",rand)), header = TRUE, colClasses = classes,sep=",")
这里 skip 给出了要拖尾的行数(由其他脚本计算,假设我已经有了这些)。我将这个函数称为 readfileIncrementally。
abcd 是 csv 文件,每个文件有 18 列。现在我 运行 这个里面的 for 循环说 for i in a b c d
a,b,c,d 是 4 个具有不同 skip 值的文件。假设 a 为 skip=10,000,b 为 20,000。如果我单独 运行 这些(不在 for 循环中),它 运行 没问题。但是在循环的情况下它给我错误扫描行 "n" 没有 18 列。通常当跳过值大于 3000(大约)时会发生这种情况。
但是我交叉检查了没有。使用命令 awk -F "," 'NF != 18' ./a.csv
的列数肯定有 18 列。
对我来说这似乎是一个时间问题,有什么方法可以在转到下一个文件之前给 R 所需的时间。或者有什么我想念的。 运行单独 运行 没问题(虽然需要几秒钟)。
data <- read.table(pipe(paste("(head -n1 && tail -n",skip," | head " as.integer(skip)-1")<",name,"| ./myscript.sh",rand)), header = TRUE, colClasses = classes,sep=",")
对我有用。基本上,在 R 读取文件时,最后一行还没有完全写入。因此显示第 n 行没有 18 列的错误。让它少读 1 行对我来说很好。
除此之外,我没有找到任何 R 功能来克服这种情况。