【问题标题】:the fastest way to write csv file by write.csv.raw (iotools package)通过 write.csv.raw(iotools 包)写入 csv 文件的最快方法
【发布时间】:2016-05-19 15:09:00
【问题描述】:

我正在尝试使用不同的包来找到最适合快速保存数据文件(例如 csv 文件)的包。

我找到了 'iotools' 包和方法 'write.csv.raw' 可以很好地保存有关时间流逝的数据。

但是保存的文件中的数据集有一些有争议的特性:

  • 没有列名;
  • double/float 数字带有小数点符号“.”但不是用 "," 。

所以我需要将文件中的数据集保存为包含列名和正确的十进制符号。
我的脚本如下:

library(iotools)
library(UsingR)

data(galton)
head(galton)
#option1 to save data
write.csv.raw(galton,"test.csv",append=FALSE,sep=";",col.names=TRUE)
#option2 to save data
write.table.raw(galton,"test.csv",append=FALSE,sep=";",col.names=TRUE)
read.csv2("test.csv",nrow=5)

输入数据集(来自 R):

child parent
61.7   70.5
61.7   68.5
61.7   65.5
61.7   64.5
61.7   64.0
62.2   67.5

输出文件:

X1.61.7 X70.5
2\t61.7  68.5
3\t61.7  65.5
4\t61.7  64.5
5\t61.7    64
6\t62.2  67.5  

16 年 2 月 18 日更新:
在 procrastinator0 的回答的帮助下,我设法以正确的方式使用了“write.csv.raw”。

根据问题部分的数据框比较不同的写入方法如下:

system.time(write.csv.raw(n,"test.csv",sep=";",append=TRUE))
用户系统已过
15.61 1.17 21.92

system.time(write.table(n,"test.csv",sep=";",row.names=FALSE,dec=","))
用户系统已过
63.25 1.20 64.60

system.time(write.csv2(n,"test.csv",row.names=FALSE))
用户系统已过 63.71 1.28 65.38

system.time(write_csv(n, "test.csv", na = "NA")) 用户系统已过
136.75 3.60 141.24

27/04/16 更新:(已过期)
我已经做了一些实验来写入/读取数据(不同的工具)。实验基于理论样本和真实样本(来自我的实践)。我试图制作可重现的脚本。希望它们对新手有用:-)

IO 实验链接:

从文件中读取数据:https://rpubs.com/demydd/166375
将数据写入文件:https://rpubs.com/demydd/170957

16 年 9 月 19 日更新:
添加羽毛包(read_feather,write_feather) fwrite 是从 data.table 包中添加的。

更新测试的链接:

to read
to write

【问题讨论】:

  • 问题不清楚,说没有列,但用col.names=TRUE写出来。数据没有争议,有什么问题?
  • 了解(大致)您尝试写入的真实数据的维度也会很有趣。
  • @zx8754:我的意思是保存的文件中的数据集。如果我打开文件,我看不到列名和小数点符号“。”代替“,”。 @ docendo discimus:初始数据集是 386000 行和 140 列(数字和非数字)。在应用程序“write.csv.raw”之后,我没有 colnames 和正确的十进制符号。之后我开始测试诸如高尔顿之类的微小样本。
  • write.csv.rawwrite_csv{readr} 快吗?您的问题是哪种方法是编写.csv 文件的最快方法,对吧?
  • @Rafael Pereira 你是真的。我正在寻找以正确方式编写 csv 的最快方法。根据我的测试,到目前为止,最快的方法是 fread() 和 write.csw.raw()。但我还没有测试 write_csv{readr}。如果你能提供更好的东西 - 非常欢迎你:-)

标签: r csv


【解决方案1】:

您可以将列名保存为因子,然后按如下方式使用:

library(iotools)
library(UsingR)

data(galton)

Cnames=as.factor(colnames(galton))

write.table(galton,"test2.csv",sep=";")

test2=read.delim("test2.csv",sep = ";",)
colnames(test2)=Cnames

输出是:

head(test2)
  child parent
1  61.7   70.5
2  61.7   68.5
3  61.7   65.5
4  61.7   64.5
5  61.7   64.0
6  62.2   67.5

【讨论】:

  • @knife:谢谢你的帮助。但在我看来,您没有使用 iotools 包中的工具('write.csv.raw' 或 'write.table.raw'。这些方法将大大降低时间成本(在我的真实数据集的情况下(386000 X 140) 3 倍)。仅使用 'write.table' 不会增加时间开销。
【解决方案2】:

对于列名,这是known issue。建议的解决方法:

> cat(noquote(paste0(paste0(names(df),collapse = ","),"\n")),file = "output.csv")
> write.csv.raw(df,"output.csv",append=TRUE)

默认情况下,write.csv.raw 不使用“\t”为我编制索引,但您可以尝试将 NA 用于 nsep 参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2017-07-08
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    相关资源
    最近更新 更多