2016-04-25 77 views
-1

語言,R創建使用兩個單獨的數據集彙總表data.table [R

套餐:data.table

我有兩個數據集:一,所有的國家名稱列(關鍵數據集)還有一個關於一個地區是出生國的人口的數據。我想要製作每個國家出生人數的data.table。現在可能會有一些國家沒有參與者出生。我如何使用data.table命令創建這樣的表格?

例子:

CountryKey = data.table(Country = LETTERS[1:5]) 
DT = data.table(Person = c(1,2,3,4,5,6,7), Birth = LETTERS[c(1,1,2,3,2,1,3)]) 

DT 
    Person Birth 
1:  1  A 
2:  2  A 
3:  3  B 
4:  4  C 
5:  5  B 
6:  6  A 
7:  7  C 

CountryKey 
    Country 
1:  A 
2:  B 
3:  C 
4:  D 
5:  E 

DT[, j = .(.N), by = .(Birth)] 
    Birth N 
1:  A 3 
2:  B 2 
3:  C 2 

由於當時沒有人出生在d和E他們不輸出顯示。但是我想看到它們的值爲零。

@Frank回答了這個問題。

DT[CountryKey, on=c(Birth = "Country"), .N, by=.EACHI] 
    Birth N 
1:  A 3 
2:  B 2 
3:  C 2 
4:  D 0 
5:  E 0 

但是,CountryKey文件在其行中可能不是唯一的。假設它只是一些類似於DT的數據集,並且許多行都在同一個國家。那我們怎麼做呢?

CountryKey = data.table(Country =c('A','B','B','C','C','D','E','D','D')) 

    Country 
1:  A 
2:  B 
3:  B 
4:  C 
5:  C 
6:  D 
7:  E 
8:  D 
9:  D 

上述解決方案給出的結果不是我想要的。我只想看到每個國家的唯一條目。

DT[CountryKey, on=c(Birth = "Country"), .N, by=.EACHI] 
    Birth N 
1:  A 3 
2:  B 2 
3:  B 2 
4:  C 2 
5:  C 2 
6:  D 0 
7:  E 0 
8:  D 0 
9:  D 0 

@弗蘭克的回答部分作品:

DT[unique(CountryKey), on=c(Birth = "Country"), .N, by=.EACHI] 
    Birth N 
1:  A 3 
2:  B 2 
3:  C 2 
4:  D 0 
5:  E 0 

但是,如果CountryKey有幾個專欄,它沒有:由@Frank

CountryKey = data.table(Country =c('A','B','B','C','C','D','E','D','D'), 
Somevalue = sample(x = 3, size = 9, replace = T)) 

DT[unique(CountryKey), on=c(Birth = "Country"), .N, by=.EACHI] 
    Birth N 
1:  A 3 
2:  B 2 
3:  B 2 
4:  C 2 
5:  C 2 
6:  D 0 
7:  E 0 
8:  D 0 

解決方案:

DT[i = unique(CountryKey$Country), on="Birth", .N, by=.EACHI] 
P.S. : You should have 1.9.7. Earlier versions will give an error. 
+2

您是否注意到我早先的評論? http://stackoverflow.com/q/25869543/和'DT [CountryKey,on = c(Birth =「Country」),.N,by = .EACHI]' – Frank

+0

是的,我已經寫了,但是你沒有給我足夠的時間。謝謝。 – ilyas

+0

好的,沒問題。我會將它標記爲一個重複,但可以撤消,如果需要 – Frank

回答

3

這裏有一種方法:

DT[.(unique(CountryKey$Country)), .N, on="Birth", by=.EACHI] 

的OP報告,這給data.table 1.9中的錯誤.6(說Birth是一個因素)。在這種情況下,首先運行DT[, Birth := as.character(Birth)]

2

我認爲編碼DT $ Birt h作爲CountryKey $ Country的唯一值的級別的因素實際上是解決此問題的最優雅的方式(概念上和實際上)。因素類是完全寫出來處理這樣的情況。這也適用於data.tables和data.frames。

CountryKey = data.table(Country = LETTERS[1:5]) 
DT = data.table(Person = c(1,2,3,4,5,6,7), Birth = LETTERS[c(1,1,2,3,2,1,3)]) 

DT$Birth_factor<-as.factor(DT$Birth) 
levels(DT$Birth_factor)<-unique(CountryKey$Country) 
table(DT$Birth_factor) 

表)的結果(

> table(DT$Birth_factor) 

A B C D E 
3 2 2 0 0 

的data.table專用模擬可能看起來像:

DT[, Birth := factor(Birth, levels = union(Birth, CountryKey$Country))] 
DT[levels(Birth), .N, on = "Birth", by=.EACHI] 
+0

基於完全基於什麼指標的「最佳方式」?並修復這些'< - ',並用':='替換它們。 – eddi

+0

@阿曼感謝您的意見。我知道如何使用表格。我試圖做data.table的方式。但我也喜歡你的回答。 – ilyas

+0

@Frank你試過你的答案嗎?第二個錯誤。 – ilyas