我正在尝试重塑R中的数据框,使用推荐的方式似乎有问题。数据帧具有以下结构:

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


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

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


数据框具有超过4,500,000个观察值(尽管VALUE的约70%是NA)。该计算机是具有4Gb RAM的基于Intel的Linux工作站。将数据(从压缩的Rdata文件中)加载到新的R进程中会使它增长到大约250Mb,这显然留下了许多用于重塑的空间。

到目前为止,这些是我的经验:


使用香草reshape()方法:

tbl2 timevar =“ VALTYPE”);


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


使用cast()包的reshape方法:

tbl2

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


使用by()merge()

sp tbl 通过= c(“ ID”,“ DATE1”,“ DATE2”),全部= TRUE,sort = TRUE);


结果:效果很好,尽管它不是很优雅且安全可靠(即,如果添加更多类型,它将损坏)。

为了增加伤害,可以在大约3行AWK或Perl中(几乎不使用任何RAM)轻松完成所讨论的操作。所以问题是:在R中使用推荐的方法而不消耗所有可用RAM的更好方法是什么?

最佳答案

一个有用的技巧是将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%。

07-24 09:22
查看更多