13

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

これが私のコード例です:

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

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

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

助言がありますか?

編集:私が書き込もうとしている文字ベクトルの行の例は次のとおりです。

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

クラスラベル/y変数は「|」によってx変数から分離され、変数名は「:」および変数間のスペースによって値から分離されます。

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 

私がこれを理解するのを手伝ってくれてありがとう。

4

5 に答える 5

26

writeLines文字列のリストが必要です。これをgzipファイルに書き込む最も簡単な方法は次のとおりです。

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)

これにより、gzip圧縮されたcsvとして書き込まれます。また、ファイルを書き出す別の方法については、を参照write.tableしてください。write.csv2

編集:希望する形式に関する投稿の更新に基づいて、次のヘルパーを作成しました(すばやくまとめて、おそらくかなりの簡略化を認めます):

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に渡して、目的の出力を取得することだけです。

于 2013-01-08T23:09:46.950 に答える
4

gzipファイルに何かを書き込むには、それをテキストに「シリアル化」する必要があります。Rオブジェクトの場合、次を使用してそれを突き刺すことができますdput

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

ただし、データフレームのテキスト表現をファイルに書き込んだだけです。save(df1,file="df1.RData")これは、ネイティブRデータファイルに保存するために使用するよりもおそらく効率が悪くなります。自問してみてください:なぜそれを.gzファイルとして保存するのですか?

いくつかの乱数を使用した簡単なテストでは、gzファイルは54k、.RDataファイルは34kでした。

于 2013-01-08T23:10:40.793 に答える
3

それを行う別の非常に簡単な方法は次のとおりです。

# We create the .csv file
write.csv(df1, "df1.csv")

# We compress it deleting the .csv
system("gzip df1.csv")

http://blog.revolutionanalytics.com/2009/12/r-tip-save-time-and-space-by-compressing-data-files.htmlからアイデアを得ました

于 2017-01-03T16:59:04.220 に答える
1

R.utilsでgzip関数を使用できます。

library(R.utils)
library(data.table)

#Write gzip file
df <- data.table(var1='Compress me',var2=', please!')
fwrite(df,'filename.csv',sep=',')
gzip('filename.csv',destname='filename.csv.gz')`

#Read gzip file
fread('gzip -dc filename.csv.gz')
          var1      var2
1: Compress me , please!
于 2018-05-23T02:31:25.087 に答える
0

Tidyverseメソッドの場合、ファイル名に圧縮拡張子を追加すると、圧縮が実行されます。https://readr.tidyverse.org/reference/write_delim.htmlから

適切な拡張子が指定されている場合、write _ *()関数は出力を自動的に圧縮します。現在、gzip圧縮用の.gz、bzip2圧縮用の.bz2、lzma圧縮用の.xzの3つの拡張子がサポートされています。

library(tidyverse)
df <- data.table(var1='Compress me',var2=', please!')
write_csv(df, "filename.csv.gz")
于 2020-09-22T14:08:43.337 に答える