繁体   English   中英

在for循环中读取R中的大型csv文件

[英]read large csv files in R inside for loop

为了加快速度,我设置了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=",")这里的skip给我尾行的行数(由其他脚本计算得出,假设我已经有这些行了)。 我将此函数称为增量readfile。

abcd是csv文件,每个文件有18列。 现在我在for循环中在abcd中为我说

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM