【问题标题】:What is the fastest way to read a data frame in R compared to Stata?与 Stata 相比,在 R 中读取数据帧的最快方法是什么?
【发布时间】:2014-12-26 18:36:19
【问题描述】:

我有这个包含 57000 行和 5500 列的数据集。它们既是数字变量又是字符变量。我最初以 .dta 格式下载数据,Stata 读取它非常快。当我使用timer 命令计时时,它需要 0.13 个烤饼。

现在,我一直在使用 R,并且从我的阅读来看,它应该更有效率。我将我的数据从 Stata 导出到 csv,甚至按照我在堆栈交换中阅读的建议,结果并不令人信服。

这是我遇到的最佳解决方案:

library(data.table)
system.time(fread("~/Data/GSS/GSS.csv", stringsAsFactors=FALSE, header=T, na.strings=paste0(".",letters), data.table=FALSE)

)

我明白了:

Read 57061 rows and 5548 (of 5548) columns from 1.053 GB file in 00:00:46
  user  system elapsed 
  52.000   1.492  53.470 

我也收到了很多关于缺失值的警告,尽管我已经声明了它们。警告:

Bumped column XXXX to type character on data row XXXX, field contains '.n'. 

我认为这与 R 无法识别数字列中的这些缺失值有关

关于如何改进这一点有什么建议吗?作为旁注,我尝试了 sqldf 但它在我的计算机上不起作用,甚至将软件包升级到最新版本。

这是我正在处理的数据: http://www3.norc.org/GSS+Website/Download/

【问题讨论】:

  • Stata 可以更快地读取.dta,因为这是一种二进制格式。读取二进制文件几乎总是比读取文本文件更有效。一个适当的比较是针对 Stata 读取 csv 的速度。你试过用foreign::read.dta读取R中的.dta文件吗?
  • read.dta 实际上比使用 csv 的 freed 慢!
  • 但你说fread 留下了许多列作为字符,可能是因为 Stata 的多个缺失值类型。 read.dta 是否像您期望的那样处理它们? fast + not_what_you_want < slow + correct
  • read.dta 确实可以更好地处理 NA...
  • 然后用read.dta读入一次,然后将其保存到.Rdata.rds文件并完成。 :)

标签: r performance csv stata cpu-speed


【解决方案1】:

我发现readstata13 包中的read.dta13 通常是阅读Stata 文件的最佳选择。

read.dta13 的主要优点是它能够将 Stata 的标记数据正确读取为因子格式并保持顺序,我认为这非常重要。它还可以读取任何版本的 Stata,包括 Stata 15 文件。

使用havenforeign 包我无法做到这一点。

【讨论】:

    猜你喜欢
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2020-01-05
    • 1970-01-01
    • 2013-10-24
    • 1970-01-01
    相关资源
    最近更新 更多