在R中更改数据框的尺寸

时间:2013-10-09 15:13:22

标签: r plyr data-manipulation

我有一个包含数十列和数千行的数据集。在这里,我只展示一个玩具示例:

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))

我要做的第一件事是为每个varX样条插值列tt作为列trN的函数。使用ddply包中的plyr轻松完成的操作。

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 个答案:

答案 0 :(得分: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

如果你的瓶颈确实是内部计算而不仅仅是分组问题,那么请查看例如: multicore and data.table in Rdata.table and parallel computing