繁体   English   中英

具有数据整形的R性能

[英]R performance with data reshaping

我正在尝试重塑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个观测值(尽管大约70%的VALUENA )。 该机器是基于Intel的Linux工作站,具有4Gb RAM。 将数据(从压缩的Rdata文件)加载到新的R进程使其增长到大约250Mb,这显然留下了大量的重塑空间。

这是我迄今为止的经历:

  • 使用vanilla reshape()方法:

    tbl2 < - reshape(tbl,direction =“wide”,idvar = c(“ID”,“DATE1”,“DATE2”),timevar =“VALTYPE”);

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

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

    tbl2 < - cast(tbl,ID + DATE1 + DATE2~VALTYPE);

结果:R进程消耗所有RAM,看不到尽头。 不得不最终杀死这个过程。

  • 使用by()merge()

    sp < - by(tbl [c(1,2,3,5)],tbl $ VALTYPE,function(x)x); tbl < - merge(sp [[“TYPE1”]],sp [[“TYPE2”]],by = c(“ID”,“DATE1”,“DATE2”),all = TRUE,sort = TRUE);

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

为了增加对伤害的侮辱,可以在大约3行AWK或Perl(并且几乎没有使用任何RAM)中简单地实现所讨论的操作。 所以问题是:在没有消耗所有可用RAM的情况下,使用推荐方法在R中执行此操作的更好方法是什么?

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

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

在我的intel core2 duo 2.2ghz macbook中,它在类似大小的问题上快了大约40%。

那么以非R方式做这件事呢? 我假设你为ID,DATE1,DATE2的每个值都有一个TYPE1和一个TYPE2行? 然后按这些变量对数据帧进行排序,并编写一个大的for循环。 您可以重复执行rbind()操作来构建表,或者您可以尝试预先分配表(可能)并仅使用[< - 分配VALUE.TYPE1和VALUE.TYPE2个插槽,这应该在以下情况下进行分配:地点。

(注意,如果你使用的是rbind(),我相信如果你有任何因子变量它是低效的,所以确保一切都是一个字符!)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM