的每3元組的在行中位數。如果我有一個數據幀,例如:加快計算列
df = data.frame(matrix(rnorm(100), 5000, 100))
我可以使用下面的函數獲取三個學期中位數排的每個組合-wise:
median_df = t(apply(df, 1, combn, 3, median))
問題是,這個函數需要幾個小時才能運行。罪魁禍首是median(),比max()或min()運行時間要長10倍。
如何通過寫入更高版本的median()或使用原始數據以不同方式加速此功能?
更新:
如果我運行上面的代碼但僅針對DF [,1:10],例如:
median_df = t(apply(df[,1:10], 1, combn, 3, median))
需要29秒
fastMedian_df = t(apply(df[,1:10], 1, combn, 3, fastMedian))
從包ccaPP需要6.5秒
max_df = t(apply(df[,1:10], 1, combn, 3, max))
需要2.5秒
所以我們看到fastMedian()的顯着改進。我們還可以做得更好嗎?
雖然'中位數'可能會造成一些問題,與'max'和'min'相比,我認爲'combn'的真正問題。例如,單行('system.time(combn(df [1,],3))')在我的機器上需要大約10秒。 – nrussell
@nrussell while combnPrim combn()的快速實現,在這種情況下我無法獲得combnPrim的工作,返回錯誤:錯誤if(simplified){:參數不可理解爲邏輯 –
在任何情況下,combn()在這個函數中運行median()需要的時間少於10% –