我有一个包含数十列和数千行的数据集。在这里,我只展示一个玩具示例:
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
包的解决方案,因为我可以利用已实现的并行化。
答案 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 R或data.table and parallel computing