2014-05-07 144 views
5

我有一個類似的問題:R: data.table : searching on multiple columns AND setting data type,但這個問題沒有得到完全解答。我有一個配對錶,看起來像下面這個。該表是將非常大的距離矩陣轉換爲data.table(> 100,000,000行)的結果,以便比較a,b與b,a相同。然而,a和b可能出現在列V1或V2中。我想使用data.table的查詢風格來計算簡單的彙總統計信息,但是我還沒有弄清楚如何在任一列中選擇鍵。這可能嗎?R Data.table用於計算跨多列的彙總統計信息

我試過在任一方向設置鍵,但是這隻返回該列的數據。我也嘗試使用list(),但返回交集(可以理解),我希望通過= key1 | key2,但沒有這樣的運氣。


> set.seed(123) 
> 
> #create pairwise data 
> a<-data.table(t(combn(3,2))) 
> #create column that is equal both ways, 1*2 == 2*1 
> dat<-a[,data:=V1*V2] 
> dat 
    V1 V2 data 
1: 1 2 2 
2: 1 3 3 
3: 2 3 6 
#The id ==2 is the problem here, the mean should be 4 ((2+6)/2) 

> #set keys 
> setkey(dat,V1,V2) 
> 
> #One way data 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2.5 0.5 
2: 1 3 3 2.5 0.5 
3: 2 3 6 6.0 NA 

> #The other way 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V2] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2.0 NA 
2: 1 3 3 4.5 4.5 
3: 2 3 6 4.5 4.5 
> 
> #The intersect just produces the original data 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=list(V1,V2)] 
> dat 
    V1 V2 data MEAN VAR 
1: 1 2 2 2 NA 
2: 1 3 3 3 NA 
3: 2 3 6 6 NA 
> 
> #Meaningless but hopefull attempt. 
> dat[,c("MEAN","VAR"):=list(mean(data),var(data)),by=V1|V2] 
> dat 
    V1 V2 data  MEAN  VAR 
1: 1 2 2 3.666667 4.333333 
2: 1 3 3 3.666667 4.333333 
3: 2 3 6 3.666667 4.333333 
#The goal is to create a table would look like this (using mean as an example) 
ID MEAN 
1 2.5 
2 4.0 
3 4.5 

我的默認想法將通過DAT太環[V1 == X | V2 == X]聲明,但我不認爲我利用的data.table的全功率返回一個單個 ids列,其中var表示爲彙總列。

謝謝!

+1

到底是什麼你的期望結果在這裏? – eddi

+0

編輯以反映有希望的結果,該結果是具有該ID的均值和var的單個id列。感謝您幫助澄清。 – bw4sz

回答

4

這將是最簡單的重新安排你的數據一點點地實現你想要的(我用的data下面未回收在第一部分中鍵入c(data, data)):

dat[, list(c(V1, V2), data)][, list(MEAN = mean(data)), by = V1] 
# V1 MEAN 
#1: 1 2.5 
#2: 2 4.0 
#3: 3 4.5