我正在尝试将数据帧写入gzip文件但存在问题。
这是我的代码示例:
df1 <- data.frame(id = seq(1,10,1), var1 = runif(10), var2 = runif(10))
gz1 <- gzfile("df1.gz","w" )
writeLines(df1)
writeLines(df1)
中的错误:无效的'text'参数
有什么建议吗?
编辑: 我想写的字符向量的示例行是:
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 :(得分:19)
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压缩包。另请参阅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以获得所需的输出。
答案 1 :(得分: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
答案 2 :(得分: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
获得了这个想法答案 3 :(得分: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!
答案 4 :(得分: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")