【问题标题】:R performance with data reshaping数据重塑的 R 性能
【发布时间】:2010-12-24 01:44:24
【问题描述】:

我正在尝试在 R 中重塑数据框,但使用推荐的方法似乎存在问题。数据框结构如下:

ID                     DATE1             DATE2            VALTYPE        VALUE
'abcd1233'         2009-11-12        2009-12-23           'TYPE1'        123.45
...

VALTYPE 是一个字符串,并且是一个只有 2 个值的因子(例如 TYPE1TYPE2)。我需要根据通用 ID 和 DATE 将其转换为以下数据框(“宽”转置):

ID                     DATE1             DATE2            VALUE.TYPE1  VALUE.TYPE2
'abcd1233'             2009-11-12        2009-12-23       123.45           NA
...

数据框有超过 4,500,000 个观察值(尽管 VALUEs 中大约 70% 是 NA)。该机器是基于 Intel 的 Linux 工作站,具有 4Gb 的 RAM。将数据(从压缩的 Rdata 文件)加载到新的 R 进程中,使其增长到大约 250Mb,这显然为整形留下了很大的空间。

这些是我迄今为止的经历:

  • 使用香草reshape() 方法:

    tbl2

结果:Error: cannot allocate vector of size 4.8 Gb

  • 使用reshape包的cast()方法:

    tbl2

结果:R 进程消耗了所有 RAM,而且看不到尽头。最终不得不终止进程。

  • 使用by()merge()

    sp

结果:工作正常,虽然这不是很优雅和万无一失(即,如果添加更多类型,它将破坏)。

为了雪上加霜,所讨论的操作可以在大约 3 行 AWK 或 Perl 中轻松实现(并且几乎不使用任何 RAM)。所以问题是:在不消耗所有可用 RAM 的情况下,使用推荐的方法在 R 中执行此操作的更好方法是什么?

【问题讨论】:

    标签: performance r


    【解决方案1】:

    一个有用的技巧是将 id 变量组合成一个字符向量,然后进行 reshape。

    tbl$NEWID <- with(tbl, paste(ID, DATE1, DATE2, sep=";"))
    tbl2 <- recast(tbl2, NEWID ~ VALTYPE, measure.var="VALUE")
    

    在我的 intel core2 duo 2.2ghz macbook 中处理类似大小的问题时,速度大约快 40%。

    【讨论】:

    • 不,使用recast() 显示与上述cast() 方法相同的问题 - 进程超过 5 Gb 的虚拟内存,所以我在大约 1 小时后将其杀死。
    【解决方案2】:

    以非 R 的方式执行此操作怎么样?我假设您对于 ID、DATE1、DATE2 的每个值都有一个 TYPE1 和一个 TYPE2 行?然后按这些变量对数据框进行排序,并编写一个大的 for 循环。您可以重复执行 rbind() 操作来构建表,或者您可以尝试预先分配表(也许)并使用 [

    (请注意,如果您使用的是 rbind(),我认为如果您有任何因子变量,则效率低下,因此请确保所有内容都是字符!)

    【讨论】:

    • 没有rbind 和循环:tbl &lt;- tbl[with(tbl,order(ID,DATE1,DATE2,VALTYPE)),]; tbl_out &lt;- tbl[seq(1,nrow(tbl),by=2),-4]; names(tbl_out)[4] &lt;- "VALUE.TYPE1"; tbl_out$VALUE.TYPE2 &lt;- tbl$VALUE[seq(2,nrow(tbl),by=2)];
    • 我们不能真正假设每个 ID/DATE 正好有 2 个条目。这将立即破坏上述 Marek 的代码。此外,它甚至比我在问题正文中工作的by()/merge() 代码更脆弱。总的来说,我对循环方法没有任何问题,只是我不明白为什么专门为此目的的函数(即reshape() 在这样一个微不足道的问题上失败了)
    【解决方案3】:

    也许你可以使用 cat() 函数?

    【讨论】:

      猜你喜欢
      • 2015-04-18
      • 1970-01-01
      • 2013-04-20
      • 2014-03-10
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-09
      相关资源
      最近更新 更多