我有一个以面向人格式的纵向数据的数据集,如下:
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
我尝试了不同的方法来重塑数据帧(*apply
,plyr
,reshape2
,循环,追加与预填充所有数字矩阵等等,但似乎没有获得一个不错的处理时间(子集为+ 40分钟)。我一路上已经收到了各种提示,但是我仍然不确定我是否会错过一些瓶颈或可能的加速。
是否有最佳方法来处理这种数据处理,以便我可以评估在纯R代码中可以实现的最佳处理时间? Stackoverflow上有similar questions,但它们并没有令人信服的答案......
答案 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上有很多例子。