[英]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.