4

我有一个数据集,其中包含面向人的格式的纵向数据,例如:

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 个变量,最多可测量 29 个周期。

我想获得一个更面向周期的格式,例如:

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

我尝试了不同的方法来重塑数据框(*apply, plyr, reshape2, 循环,追加与预填充所有数字矩阵等),但似乎没有得到合适的处理时间(子集 +40 分钟)。在此过程中,我已经收集了各种关于要避免什么的提示,但我仍然不确定我是否错过了一些瓶颈或可能的加速。

是否有处理这种数据处理的最佳方法,以便我可以评估在纯 R 代码中可以实现的最佳处理时间?Stackoverflow 上也有类似的问题,但都没有给出令人信服的答案……

4

2 回答 2

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 = "_")

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

于 2011-10-17T10:05:44.203 回答
1

如果东西适合内存,那么久经考验的 stack() 函数可以非常快。

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

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

于 2011-10-17T09:17:23.003 回答