我正在尝试重塑R中的数据框,并且使用建议的方法似乎有问题。数据框具有以下结构:
ID DATE1 DATE2 VALTYPE VALUE
'abcd1233' 2009-11-12 2009-12-23 'TYPE1' 123.45
...
VALTYPE
是一个字符串,是一个只有2个值的因子(比如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
)。该机器是基于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
使用cast()
包的reshape
方法:
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)中轻易地实现所讨论的操作。所以问题是:使用推荐的方法在R中执行此操作的更好方法是什么,而不消耗所有可用的RAM?
答案 0 :(得分:1)
一个有用的技巧是将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%。
答案 1 :(得分:1)
以非R方式做这件事怎么样?我假设你为ID,DATE1,DATE2的每个值都有一个TYPE1和一个TYPE2行?然后按这些变量对数据帧进行排序,并编写一个大的for循环。您可以重复执行rbind()操作来构建表,或者您可以尝试预分配表(可能)并且只使用[&lt; - ,分配VALUE.TYPE1和VALUE.TYPE2时隙,这应该在-地点。
(请注意,如果您使用的是rbind(),我相信如果您有任何因子变量,它效率很低,所以请确保所有内容都是字符!)
答案 2 :(得分:1)
也许你可以使用cat()函数?