加快重塑人员到R中的周期格式数据框架

时间:2011-10-17 08:40:54

标签: performance r reshape data-manipulation

我有一个以面向人格式的纵向数据的数据集,如下:

pid varA_1 varB_1 varA_2 varB_2 varA_3 varB_3 ...
1   1      1      0      3      2      1
2   0      1      0      2      2      1
...
50k 1      0      1      3      1      0

这会产生一个大型数据帧,最少观察50k,最多可测量90个变量。

我希望获得更加面向时间的格式,如下:

pid index start stop varA varB varC ...
1   1     ...
1   2     
...
1   29
2   1

我尝试了不同的方法来重塑数据帧(*applyplyrreshape2,循环,追加与预填充所有数字矩阵等等,但似乎没有获得一个不错的处理时间(子集为+ 40分钟)。我一路上已经收到了各种提示,但是我仍然不确定我是否会错过一些瓶颈或可能的加速。

是否有最佳方法来处理这种数据处理,以便我可以评估在纯R代码中可以实现的最佳处理时间? Stackoverflow上有similar questions,但它们并没有令人信服的答案......

2 个答案:

答案 0 :(得分:3)

首先,让我们构建数据示例(我使用的是5e3而不是50e3,以避免我的配置出现内存问题):

nObs <- 5e3
nVar <- 90
nPeriods <- 29

dat <- matrix(rnorm(nObs*nVar*nPeriods), nrow=nObs, ncol=nVar*nPeriods)

df <- data.frame(id=seq_len(nObs), dat)

nmsV <- paste('Var', seq_len(nVar), sep='')
nmsPeriods <- paste('T', seq_len(nPeriods), sep='')

nms <- c(outer(nmsV, nmsPeriods, paste, sep='_'))
names(df)[-1] <- nms

现在使用stats::reshape更改格式:

df2 <- reshape(df, dir = "long", varying = 2:((nVar*nPeriods)+1), sep = "_")

我不确定这是否是您正在寻找的 fast 解决方案。

答案 1 :(得分:1)

如果适合内存,那么老化的stack()函数可以非常快。

对于大型集合,使用(透明)sqlite数据库作为中间件是最好的。试试Gabor的软件包sqldf,googlecode上有很多例子。

http://code.google.com/p/sqldf/