5

R (ギガ単位) に非常に大きなデータ ファイルがあり、 R で開こうとすると、メモリ不足エラーが発生します。

ファイルを 1 行ずつ読み取り、分析を行う必要があります。この問題に関する以前の質問で、ファイルが n 行で読み取られ、クランプのある特定の行にジャンプすることがわかりました。「Nick Sabbe」の回答を使用し、必要に応じていくつかの変更を加えました。

ファイルの次の test.csv ファイル サンプルがあるとします。

A    B    C
200 19  0.1
400 18  0.1
300 29  0.1
800 88  0.1
600 80  0.1
150 50  0.1
190 33  0.1
270 42  0.1
900 73  0.1
730 95  0.1

ファイルの内容を 1 行ずつ読み取り、分析を実行したいと考えています。そこで、"Nick Sabbe" によって投稿されたコードに基づいて、読み取る次のループを作成しました。2 つの問題があります。1) 新しい行を印刷するたびにヘッダーが印刷されます。2) R によるインデックス "X" 列も印刷されますが、この列は削除しています。

私が使用しているコードは次のとおりです。

test<-function(){
 prev<-0

for(i in 1:100){
  j<-i-prev
  test1<-read.clump("file.csv",j,i)
  print(test1)
  prev<-i

}
}
####################
# Code by Nick Sabbe
###################
read.clump <- function(file, lines, clump, readFunc=read.csv,
                   skip=(lines*(clump-1))+ifelse((header) & (clump>1) & (!inherits(file, "connection")),1,0),
                   nrows=lines,header=TRUE,...){
if(clump > 1){
colnms<-NULL
if(header)
{
  colnms<-unlist(readFunc(file, nrows=1, header=F))
  #print(colnms)
}
p = readFunc(file, skip = skip,
             nrows = nrows, header=FALSE,...)
if(! is.null(colnms))
{
  colnames(p) = colnms
}
} else {
 p = readFunc(file, skip = skip, nrows = nrows, header=header)
}
p$X<-NULL   # Note: Here I'm setting the index to NULL
return(p)
}

私が得ている出力:

       A       B    C
1      200      19   0.1
  NA   1       1     1
1  2   400     18   0.1
  NA   1       1    1
1  3   300     29   0.1
  NA   1       1    1
1  4   800     88   0.1
  NA   1       1    1
1  5   600     80   0.1

残りの読書のために取り除きたい:

 NA   1       1     1

また、他の言語でEOFなどのファイルの終わりが発生したときにforループを停止させる方法はありますか???

4

2 に答える 2

5

たぶん、このようなものがあなたを助けることができます:

inputFile <- "foo.txt"
con  <- file(inputFile, open = "r")
while (length(oneLine <- readLines(con, n = 1)) > 0) {
  myLine <- unlist((strsplit(oneLine, ",")))
  print(myLine)
} 
close(con)

または@MatthewPlourdeとして分割を避けるためにスキャンを使用

scan を使用します。ヘッダーをスキップし、 quiet = TRUE を使用して、アイテムの数を示すメッセージを表示しません

while (length(myLine <- scan(con,what="numeric",nlines=1,sep=',',skip=1,quiet=TRUE)) > 0 ){
   ## here I print , but you must have a process your line here
   print(as.numeric(myLine))

} 
于 2012-12-04T21:50:31.573 に答える