2013-10-09 158 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