gpt4 book ai didi

r - 如何将数据快速加载到R中?

转载 作者:行者123 更新时间:2023-12-03 07:49:07 29 4
gpt4 key购买 nike

我有一些 R 脚本,我必须尽快在 R 中加载多个数据帧。这非常重要,因为读取数据是该过程中最慢的部分。例如:从不同的数据帧进行绘图。我以 sav (SPSS) 格式获取数据,但我可以按照建议将其转换为任何格式。不幸的是,合并数据帧不是一个选项。

加载数据最快的方法是什么?我想到了以下几点:

  • 第一次从sav转换为二进制R对象(Rdata),之后总是加载它,因为它看起来比读取快得多。 spss
  • sav 转换为 csv 文件,并从 this 中讨论的具有给定参数的文件中读取数据主题,
  • 或者是否值得在本地主机上设置 MySQL 后端并从中加载数据?能不能更快一点?如果是这样,我是否还可以保存变量的任何自定义 attr 值(例如 Spss 导入文件中的 variable.labels)?或者这应该在单独的表中完成?

欢迎任何其他想法。感谢您提前提出的每一个建议!

<小时/>

我做了一个小实验below根据您给出的答案,还添加了(2011年1月24日)一个相当“hackish”但非常快速的解决方案,仅从特殊的二进制文件加载几个变量/列。后者似乎是我现在能想象到的最快的方法,这就是为什么我制作了(05/03/2011:ver.0.3)一个名为 saves 的小包。来处理这个特性。该软件包正在“繁重”开发中,欢迎任何推荐!

我很快就会在 microbenchmark 的帮助下发布一个包含准确基准测试结果的小插图。包。

最佳答案

谢谢大家的提示和解答,我在此基础上做了一些总结和实验。

请参阅下面的公共(public)数据库 ( ESS 2008 in Hungary ) 的小测试。该数据库有 1508 个案例和 508 个变量,因此它可能是一个中等规模的数据。这可能是(对我来说)进行测试的一个很好的例子,但当然特殊需求需要使用足够的数据进行实验。

从 SPSS sav 文件中读取数据而不进行任何修改:

> system.time(data <- read.spss('ESS_HUN_4.sav'))
user system elapsed
2.214 0.030 2.376

加载转换后的二进制对象:

> save('data',file='ESS_HUN_4.Rdata')
> system.time(data.Rdata <- load('ESS_HUN_4.Rdata'))
user system elapsed
0.28 0.00 0.28

尝试使用csv:

> write.table(data, file="ESS_HUN_4.csv")
> system.time(data.csv <- read.csv('ESS_HUN_4.csv'))
user system elapsed
1.730 0.010 1.824

尝试“微调”csv加载:

> system.time(data.csv <- read.table('ESS_HUN_4.csv', comment.char="", stringsAsFactors=FALSE, sep=","))
user system elapsed
1.296 0.014 1.362

还有sqldf包,它加载csv文件的速度似乎要快得多:

> library(sqldf)
> f <- file("ESS_HUN_4.csv")
> system.time(bigdf <- sqldf("select * from f", dbname = tempfile(), file.format = list(header = T, row.names = F, sep="\t")))
user system elapsed
0.939 0.106 1.071

并且还从本地主机上运行的 MySQL 数据库加载数据:

> library(RMySQL) 
> con <- dbConnect(MySQL(), user='root', dbname='test', host='localhost', password='')
> dbWriteTable(con, "data", as.data.frame(data), overwrite = TRUE)
> system.time(data <- dbReadTable(con, 'data'))
user system elapsed
0.583 0.026 1.055
> query <-('SELECT * FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.270 0.020 0.473

在这里,我认为我们应该添加报告的两个 system.time,因为在我们的情况下连接到数据也很重要。如果我误解了什么,请评论。

但是让我们看看是否只查询某些变量,例如。在大多数情况下,绘图时我们不需要所有数据帧,并且仅查询两个变量就足以创建它们的漂亮绘图:

> query <-('SELECT c1, c19 FROM data')
> system.time(data.sql <- dbGetQuery(con, query))
user system elapsed
0.030 0.000 0.112

看起来真的很棒!当然,在使用 dbReadTable

加载表格之后

摘要:没有什么比从二进制文件中读取整个数据更好的了,但是从相同数据库表中仅读取几列(或其他过滤数据)也可能是在一些特殊情况下进行加权。

测试环境:配备低端 SSD 的 HP 6715b 笔记本电脑(AMD X2 2Ghz、4 Gb DDR2)。

<小时/>

更新(2011年1月24日):我添加了一种相当黑客但相当“创意”的方法,仅加载二进制对象的几列 - 它看起来比任何方法都要快得多上面已经检查过了。

请注意:代码看起来非常糟糕,但仍然非常有效:)

首先,我通过以下循环将 data.frame 的所有列保存到不同的二进制对象中:

attach(data)
for (i in 1:length(data)) {
save(list=names(data)[i],file=paste('ESS_HUN_4-', names(data)[i], '.Rdata', sep=''))
}
detach(data)

然后我加载两列数据:

> system.time(load('ESS_HUN_4-c19.Rdata')) + 
> system.time(load('ESS_HUN_4-c1.Rdata')) +
> system.time(data.c1_c19 <- cbind(c1, c19))
user system elapsed
0.003 0.000 0.002

这看起来像是一个“超快”的方法! :) 注意:它的加载速度比上面最快的(加载整个二进制对象)方法快 100 倍。

我制作了一个非常小的包(名为:saves),查看github如果有兴趣,请了解更多详细信息。

<小时/>

更新(06/03/2011):我的小包( saves )的新版本已上传到 CRAN,其中可以更快地保存和加载变量 - 如果只有用户只需要数据框或列表中可用变量的子集。请参阅vignette有关详细信息,请参阅包源或 my homepage 上的源,让我还介绍一些完成的基准的漂亮箱线图:

Comparison of different data frame/list loading mechanism by speed

此箱线图显示了使用 saves 包仅加载 loadread.table 变量子集的好处从基础读取.csv,从外部或sqldfRMySQL 包读取read.spss

关于r - 如何将数据快速加载到R中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4756989/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com