1

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

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的函数。从包中轻松完成的操作。tttrNddplyplyr

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包的解决方案,因为我可以利用已实现的并行化。

4

1 回答 1

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

如果您的瓶颈确实是内部计算而不是分组问题,那么请查看R 中的多核和 data.tabledata.table 和并行计算

于 2013-10-09T15:38:03.170 回答