2012-11-09 24 views
3

我想知道,是否有可能對某些特定的taks進行有效的數據表交叉連接。使用函數crossproduct/join與data.table

比方說,我有一個向量化的版本,比較所有其他數字中的所有數字。如果我沒有記錯的話,那麼它的R中的矢量版本將

somevector <- rnorm(10, 5) 
sapply(somevector, function(x) { 
    return(x-somevector) 
}) 

是否有可能產生與data.table同一矩陣?它會有效嗎?

謝謝!

+1

不是你的問題的答案,但你可以使用'outer(somevector,somevector,' - ')',這比你的方法更快。 – Roland

+0

是的,謝謝。我運行你的片段,但我沒有得到更快的結果 'somevector < - rnorm(10000,5) system.time(sapply(somevector,function(x){return(x-somevector)})) system.time (outer(somevector,somevector,' - '))' – Drey

+0

在我的系統中,'outer'的速度提高了一倍。你可能已經用完了RAM,使得寫入磁盤的速度瓶頸。 'data.table'確實有一些令人印象深刻的魔法,但我不確定它可以加速這個操作。雖然它可能有助於解決內存問題。 – Roland

回答

0

expand.grid做什麼在SQL中被稱爲交叉連接。您可以使用它輕鬆減去兩個向量。

x<-1:7 
somevector <- rnorm(10, 5) 
df<-(expand.grid(x,somevector)) 
df[,1]-df[,2] 
+1

我不知道擴展網格,謝謝。雖然它產生矢量,但運行時仍比'sapply'和'outer'差。我認爲記憶是一個問題。我試圖用一個20k的dim矢量來'expand.grid',並且我用盡了內存。 – Drey