簡體   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