读取R里面的大型csv文件for循环

时间:2015-01-27 07:31:08

标签: r bash csv

为了加速我设置colClasses,我的readfile如下所示:

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="$1" 'BEGIN {srand()} {if(NR==1)print $0; else if(rand() < prob) print $0;}'

在对此的扩展中,我需要以增量方式读取文件。比方说,如果文件在10:am有10行,在11:am有100行,我需要那些新添加的90行+标题(没有它我将无法实现进一步的R处理)我对readfile功能进行了更改使用命令:  data <- read.table(pipe(paste("(head -n1 && tail -n",skip,")<",name,"| ./myscript.sh",rand)), header = TRUE, colClasses = classes,sep=",")这里跳过给我带尾的数量(由其他一些脚本计算,让我们说,我已经有了这些)。我把这个函数称为readfileIncrementally。

abcd是每个有18列的csv文件。现在我在里面运行这个循环说我在b c d

a,b,c,d是4个具有不同skip值的文件。让我们说跳过= 10,000表示a,20,000表示b。如果我单独运行它们(不是for循环),它运行正常。但是在循环的情况下,它给出了扫描线中的错误“n”没有18列。通常,当跳过值大于3000(大约)时会发生这种情况。

然而我交叉检查没有。使用命令awk -F "," 'NF != 18' ./a.csv的列肯定有18列。

对我来说这看起来像是一个时间问题,有没有办法在转到下一个文件之前给R所需的时间。或者有什么我想念的。在单独运行时它运行正常(虽然需要几秒钟)。

1 个答案:

答案 0 :(得分:0)

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功能来克服这种情况。