2014-02-11 94 views
3

我試圖使用data.table進行操作,如果data.table是專爲此操作設計的,則不需要。假設我有以下使用垂直條件創建一個新的列data.table

set.seed(1) 
id<-rep(LETTERS[1:6], each=3) 
event<-rep(letters[1:4], each=3, length.out=18) 
order<-rep(1:3, 6) 
var<-rnorm(18) 

dt<-data.table(id, event, order, var) 
setkey(dt, id) 

    id event order   var 
1: A  a  1 -0.62645381 
2: A  a  2 0.18364332 
3: A  a  3 -0.83562861 
4: B  b  1 1.59528080 
5: B  b  2 0.32950777 
6: B  b  3 -0.82046838 
7: C  c  1 0.48742905 
8: C  c  2 0.73832471 
9: C  c  3 0.57578135 
10: D  d  1 -0.30538839 
11: D  d  2 1.51178117 
12: D  d  3 0.38984324 
13: E  a  1 -0.62124058 
14: E  a  2 -2.21469989 
15: E  a  3 1.12493092 
16: F  b  1 -0.04493361 
17: F  b  2 -0.01619026 
18: F  b  3 0.94383621 

,我需要在一個新的列來計算值之間的Euclidean distancevar具有不同id但同樣event類型,保持觀測的給定order

我瞭解,與在data.table聲明分組by命令我將數據分成塊,我可以從其他data.table s的其他塊的連接使用,但我可以做同樣的data.table內是一回事嗎?

需要明確的是,這是想什麼,我獲得

id event order   var euclid 
1: A  a  1 -0.62645381 3.097720 
2: A  a  2 0.18364332 3.097720 
3: A  a  3 -0.83562861 3.097720 
4: B  b  1 1.59528080 2.433635 
5: B  b  2 0.32950777 2.433635 
6: B  b  3 -0.82046838 2.433635 
7: C  c  1 0.48742905  NA 
8: C  c  2 0.73832471  NA 
9: C  c  3 0.57578135  NA 
10: D  d  1 -0.30538839  NA 
11: D  d  2 1.51178117  NA 
12: D  d  3 0.38984324  NA 
13: E  a  1 -0.62124058 3.097720 
14: E  a  2 -2.21469989 3.097720 
15: E  a  3 1.12493092 3.097720 
16: F  b  1 -0.04493361 2.433635 
17: F  b  2 -0.01619026 2.433635 
18: F  b  3 0.94383621 2.433635 

非常感謝!

+0

如果有另一個'event = a',說:'id = G,event = a,order = 1:3',你會怎麼想關於它? – Arun

+0

@Arun偉大的問題。可能我想計算每個可能的情侶(如A-E,A-G,E-G)之間的距離,並且總結所有距離。你認爲這是可行的嗎? – Riccardo

+0

如果你要在你的例子中使用'rnorm',使用'set.seed'使它可以重現是很明智的。在這個例子中,我也很難理解你如何計算你的距離。 – thelatemail

回答

1

不確定效率,但這應該在一個基本水平的工作:

dt[, euclid:= dist(xtabs(var ~ id + order, data=.SD)), by=event] 

# id event order   var euclid 
# 1: A  a  1 -0.62645381 3.097720 # snip 
# 4: B  b  1 1.59528080 2.433635 # snip 
# 7: C  c  1 0.48742905  NA # snip 
#10: D  d  1 -0.30538839  NA # snip 
#13: E  a  1 -0.62124058 3.097720 # snip 
#16: F  b  1 -0.04493361 2.433635 # snip 

爲了說明@ Arun的問題,即有3+組,可以總結的dist輸出,雖然你會得到0而不是隻有一個組的NA:

dt[, euclid := sum(dist(xtabs(var ~ id + order, data=.SD))), by=event] 
+0

天才答案。非常感謝你。它還教會了我在使用'xtabs'時還沒有完全理解的東西 – Riccardo