2013-01-08 13 views
7

データフレームをgzipファイルに書き込もうとしていますが、問題があります。データフレームからgzipファイルを書き込む

ここに私のコードの例です:

df1 <- data.frame(id = seq(1,10,1), var1 = runif(10), var2 = runif(10)) 

gz1 <- gzfile("df1.gz","w") 
writeLines(df1) 

writeLines(df1)でエラー:無効な 'テキスト' 引数

任意の提案?

EDIT: 私が書くしようとしている文字ベクトルの例の行は次のとおりです。

0 | var1:1.5 var2:.55 var7:1250 

クラスラベル/ Y-変数は、によってX-VARSから分離されている「|」と変数名前は「:」で区切られ、変数間にスペースがあります。

EDIT2: 私は質問の文言/フォーマットを謝るが、ここでの結果は以下のとおりです。 古い方法:

system.time(write(out1, file="out1.txt")) 
# user system elapsed 
# 9.772 17.205 86.860 

新しい方法:

writeGzFile <- function(){ 
    gz1 = gzfile("df1.gz","w"); 
    write(out1, gz1); 
    close(gz1) 
} 

system.time(writeGzFile()) 
# user system elapsed 
# 2.312 0.000 2.478 

はのためのすべての非常に多くをありがとうこれを理解するのを手伝ってくれます。

+0

としては、多くの場合、Rhelpに聞かれます:「何の問題あなたが解決しようとしています」。 –

+0

ヒント:答え@DWinコメントは「データフレームをgzipファイルに書き込む方法はありませんか?」 – Spacedman

+0

長い質問は、 ".txtファイルまたは.gzファイルをRから書き込む方が速いのですか?" – screechOwl

答えて

16

writeLinesには文字列のリストが必要です。 gzipファイルにこれを書くための最も簡単な方法は、これはgzip圧縮されたCSVファイルとしてそれを書きます

df1 <- data.frame(id = seq(1,10,1), var1 = runif(10), var2 = runif(10)) 
gz1 <- gzfile("df1.gz", "w") 
write.csv(df1, gz1) 
close(gz1) 

だろう。ファイルを書き換える別の方法については、write.tablewrite.csv2も参照してください。

EDIT:目的の形式についての記事の更新に基づいて、私は(すぐに一緒に投げ、おそらく単純化のトンを認めている)は、次のヘルパーを作っ:

function(df) { 
    rowCount <- nrow(df) 
    dfNames <- names(df) 
    dfNamesIndex <- length(dfNames) 
    sapply(1:rowCount, function(rowIndex) { 
     paste(rowIndex, '|', 
      paste(sapply(1:dfNamesIndex, function(element) { 
       c(dfNames[element], ':', df[rowIndex, element]) 
      }), collapse=' ') 
     ) 
    }) 
} 

ので、出力は

a <- data.frame(x=1:10,y=rnorm(10)) 
writeLines(myser(a)) 
# 1 | x : 1 y : -0.231340933021948 
# 2 | x : 2 y : 0.896777389870928 
# 3 | x : 3 y : -0.434875004781075 
# 4 | x : 4 y : -0.0269824962632977 
# 5 | x : 5 y : 0.67654540494899 
# 6 | x : 6 y : -1.96965253674725 
# 7 | x : 7 y : 0.0863177759402661 
# 8 | x : 8 y : -0.130116466571162 
# 9 | x : 9 y : 0.418337557610229 
# 10 | x : 10 y : -1.22890714891874 
のように見えます

必要なのは、gzfileをwriteLinesに渡して、必要な出力を得ることだけです。

+0

VWを使っている人のために、 'writeLines'よりも速いオプションについてはこの答えも見てください:http://stackoverflow.com/a/41215573/3576984 – MichaelChirico

4

gzipファイルに何かを書き込むには、テキストを「シリアル化」する必要があります。あなただけのファイルへのデータフレームのテキスト表現を書いたしかし

gz1 = gzfile("df1.gz","w") 
dput(df1, gz1) 
close(gz1) 

:Rについてあなたはdputを使用して、その時の刺しを持つことができるオブジェクト。これは、おそらくsave(df1,file="df1.RData")を使用してネイティブRデータファイルに保存するより効率が悪くなります。なぜあなたは.gzファイルとして保存していますか?

いくつかの乱数を使った簡単なテストでは、gzファイルは54k、です。RDATAファイルは34K

+0

ありがとう。私が.gzに書いている理由は、出力が.gzファイルを読み込む別のプログラムの入力ファイルだからです。言い換えれば、それはRの生態系を去っています。それ以外の場合は.RDataを使用します。 – screechOwl

+0

.RDataファイルをgzipするだけですか?いいえ、gzipは圧縮されていないため、圧縮されていないとファイル内のデータのフォーマットについて何も教えてくれないためです。これは、gzip形式のCSVファイル、gzip形式のNetCDFファイル、gzip形式のRDataファイルですか?あなたは私たちに語っていません。 – Spacedman

+0

申し訳ありませんが、私はvowpal wabbitというプログラムの入力ファイルとして使用しています。それは '|'、 ':'、 ''を使っていくつかの奇妙な区切りを持っています。 – screechOwl

関連する問題