我正在尝试重塑R中的数据框,使用推荐的方式似乎有问题。数据帧具有以下结构:
ID DATE1 DATE2 VALTYPE VALUE
'abcd1233' 2009-11-12 2009-12-23 'TYPE1' 123.45
...
VALTYPE
是一个字符串,并且是一个只有两个值的因子(例如TYPE1
和TYPE2
)。我需要根据通用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%。