2014-02-12 73 views
4

在下面的data.table中,我有關於參與項目的團隊組成的信息。變量id告訴團隊ID,而變量event給出項目編號。變量freqrel描述了團隊的組成(您可以看到freqrel在每個團隊中的總和爲1)。嵌套分組與data.table

structure(list(id = c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L, 4L, 
4L, 4L, 5L, 5L, 5L), event = c("127b", "127b", "127b", "127b", 
"127b", "127b", "127b", "127b", "127b", "125t", "125t", "125t", 
"125t", "125t", "125t"), membr = c("engineer", "mathematician", 
"physicist", "mathematician", "physicist", "surgeon", "dentist", 
"mathematician", "programmer", "physicist", "sociologist", "surgeon", 
"musician", "sociologist", "surgeon"), freqrel = c(0.4, 0.4, 
0.2, 0.166666666666667, 0.5, 0.333333333333333, 0.333333333333333, 
0.5, 0.166666666666667, 0.75, 0.125, 0.125, 0.444444444444444, 
0.444444444444444, 0.111111111111111)), .Names = c("id", "event", 
"membr", "freqrel"), row.names = c(NA, -15L), class = c("data.table", 
"data.frame"), sorted = c("id", "event"), .internal.selfref = <pointer: 0x039a24a0>) 

我看到數據的方式被拆分成嵌套組。第一部分發生在項目層面(直線),第二部分發生在團隊層面(虛線)。

id event   membr freqrel 
1: 1 127b  engineer 0.4000000 
2: 1 127b mathematician 0.4000000 
3: 1 127b  physicist 0.2000000 
-------------------------------------- 
4: 2 127b mathematician 0.1666667 
5: 2 127b  physicist 0.5000000 
6: 2 127b  surgeon 0.3333333 
-------------------------------------- 
7: 3 127b  dentist 0.3333333 
8: 3 127b mathematician 0.5000000 
9: 3 127b programmer 0.1666667 
_____________________________________ 
10: 4 125t  physicist 0.7500000 
11: 4 125t sociologist 0.1250000 
12: 4 125t  surgeon 0.1250000 
-------------------------------------- 
13: 5 125t  musician 0.4444444 
14: 5 125t sociologist 0.4444444 
15: 5 125t  surgeon 0.1111111 

從我想加入到他們每個人的membr類型的球隊沒有特色的同時,賦予它們freqrel = 0,使內同一個項目完全可比球隊本起始條件。結果應該是這樣的:

id event   membr freqrel 
1: 1 127b  dentist 0.0000000 
2: 1 127b  engineer 0.4000000 
3: 1 127b mathematician 0.4000000 
4: 1 127b  physicist 0.2000000 
5: 1 127b programmer 0.0000000 
6: 1 127b  surgeon 0.0000000 
-------------------------------------- 
7: 2 127b  dentist 0.0000000 
8: 2 127b  engineer 0.0000000 
9: 2 127b mathematician 0.1666667 
10: 2 127b  physicist 0.5000000 
11: 2 127b programmer 0.0000000 
12: 2 127b  surgeon 0.3333333  
-------------------------------------- 
13: 3 127b  dentist 0.3333333 
14: 3 127b  engineer 0.0000000 
15: 3 127b mathematician 0.5000000 
16: 3 127b  physicist 0.0000000 
17: 3 127b programmer 0.1666667 
18: 3 127b  surgeon 0.0000000 
_____________________________________ 
19: 4 125t  musician 0.0000000 
20: 4 125t  physicist 0.7500000 
21: 4 125t sociologist 0.1250000 
22: 4 125t  surgeon 0.1250000 
-------------------------------------- 
23: 5 125t  musician 0.4444444 
24: 5 125t  physicist 0.0000000 
25: 5 125t sociologist 0.4444444 
26: 5 125t  surgeon 0.1111111 

換言之,將數據使用event作爲密鑰by後,我需要劃分的第二時間,並比較與所述第二分束而獲得的數據的塊。 但這裏的問題是,我不知道如何引用與by獲得的第一塊,然後再次如何拆分,並在數據庫之間進行比較。你有什麼想法我可以解決這個問題嗎?

如果你能幫助我,我將非常感激。真。

回答

4

這裏有一個簡單的方法:

setkey(dt, id, membr) 
ans <- dt[, .SD[CJ(unique(id), unique(membr))], by=list(event)] 

然後,您只需更換NA用0如下:

ans[is.na(freqrel), freqrel := 0.0] 

一些解釋:你的問題歸結到這一點 - 爲每個event,你想要所有可能的組合id, membr,這樣你就可以在這個全組合wi薄組合使用.SD

所以,首先我們按event,並在這一點,我們首先得到id, membr所有組合與CJ的幫助(這將默認密鑰集所有列)。但是,要執行加入,我們需要爲.SD設置密鑰。因此,我們將key設置爲dt預設爲id, membr。因此,我們在每個組中執行連接,併爲您提供預期的結果。希望這個對你有幫助。

+0

我非常感謝。我會研究你的解決方案以完全理解它。非常感謝。 – Riccardo

+0

它幫了很多。這是一個很好的解決方案,我很高興我問了這個問題,因爲你的回答讓我意識到我永遠不會獨自一人。非常感謝。編碼風格的一個很好的教訓。 – Riccardo

+0

@Arun @Riccardo:我看到這已經超過了一個月的時間,但我認爲這可能很重要。首先,'.SD [CJ()]'部分的工作原理只是因爲'nomatch = NA'默認情況下。第二,在**'.SD'中使用**的方式,'unique()'只包含'id'的值,和'membr',在**之後發現**數據表已經按照by =而不是整個數據表中的子集。這可能是這裏的預期行爲(每個「事件」有不同的'membr'集合),但可能不是。 – Peter