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-var 分隔,变量名称与值由“:”和变量之间的空格分隔。

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)

这会将其写为压缩的 csv。另请参阅write.tablewrite.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

Another very simple way to do it is:

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

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

Got the idea from: 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_*() 函数将自动压缩输出。目前支持三个扩展名,.gz 用于 gzip 压缩,.bz2 用于 bzip2 压缩和 .xz 用于 lzma 压缩。

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