2013-10-09 115 views
1

我拥有数十列和数千行数据集。在这里,我提出只是一个玩具例子:更改R中数据帧的尺寸

trN <- c(0,0,0,0,1,1,1,1) 
tt <- c(1,2,3,4,1,2,3,4) 
varX <- c(1,5,NA,9,2,NA,8,4) 
d <- as.data.frame(cbind(trN, tt, varX)) 

,我做的是样条插值列varXtt柱的每个trN功能的第一件事情。 plyr包中的ddply可轻松完成此操作。

ddply(d, .(trN), mutate, varXint = spline(tt, varX, xout = tt)$y) 

但假设我也想改变新数据框的维数(行数)。例如,我希望有一组值指定插值将发生的位置(xout),其长度不同于tt。显然,这里讨论的方法下面是不行的,因为mutate新列必须具有相同的长度为原始数据帧的列:

ddply(d, .(trN), mutate, varXint = spline(tt, varX, xout = seq(1, 4, by = 1.5))$y) 

有没有人有一个合适的解决方案或任何形式的建议?我宁愿有一个基于plyr包的解决方案,因为我可以利用实现的并行化。

回答

1

尝试一个简单的data.table第一:

library(data.table) 
dt = data.table(d) 

# I added xout since I assumed you want that 
dt[, list(varXint = spline(tt, varX, xout = seq(1, 4, by = .5))$y, 
      xout = seq(1, 4, 0.5)), 
    by = trN] 
# trN varXint xout 
# 1: 0 1.000000 1.0 
# 2: 0 3.166667 1.5 
# 3: 0 5.000000 2.0 
# 4: 0 6.500000 2.5 
# 5: 0 7.666667 3.0 
# 6: 0 8.500000 3.5 
# 7: 0 9.000000 4.0 
# 8: 1 2.000000 1.0 
# 9: 1 5.250000 1.5 
#10: 1 7.333333 2.0 
#11: 1 8.250000 2.5 
#12: 1 8.000000 3.0 
#13: 1 6.583333 3.5 
#14: 1 4.000000 4.0 

如果你的瓶颈的确是内部计算VS只是分组问题,然后检查了如multicore and data.table in Rdata.table and parallel computing

+0

谢谢。因为在我想知道是否可以在'varXint'之前定义'xout'并在样条函数中使用它之前,我从来没有使用'data.table'。我在问,因为我的'xout'变量将被用在十几个样条插值中,并且一遍又一遍地重新计算它没有什么意义。 – VLC

+1

@VLC你可以在'[.data.table'的第二个参数中使用完整表达式,所以你可以这样做:'dt [,{tmp = seq(1,4,0​​.5); some_computation(TMP); list(varXint = spline(...,xout = tmp),xout = tmp)},by = trN]' – eddi

+0

完美。再次感谢。 – VLC