2015-10-05 76 views
1

讓我們假設,我們提供了以下數據:部分和由data.table

library(data.table) 

letters <- sample (LETTERS[1:6], 100, replace = TRUE) 
quarks <- sample(c("up", "down", "charme", "strange", "top", "bottom"), 
        100, replace = TRUE) 
measures<- sample(seq(1:6), 100, replace = TRUE) 

df <- data.frame(letters, quarks, measures) 
df <- data.table(df) 
df <- df[,.(count = sum(measures)), by = list(letters, quarks)] 
df 

    letters quarks count 
--------------------------- 
1:  A bottom 13 
2:  A charme  3 
3:  A  down 14 
4:  A strange  8 
5:  A  top 11 
6:  A  up 14 
7:  B bottom  8 
8:  B charme 12 
9:  B  down  3 

基本上我們算我們有多少個觀察在每個夸克和每個字母的對應關係,通過分組由data.table庫提供的[.,]函數。

問題:我想伴隨一個新的列顯示每個字母的度量總數,以便每個夸克被標準化爲有多少個字母。特別地,這可以通過單獨獲得:

df[,.(count = sum(measures)), by = letters] 

    letters count 
1:  F 54 
2:  E 65 
3:  B 71 
4:  D 36 
5:  C 82 
6:  A 45 

這樣,每個計數每個單個的夸克可以劃分和標準化爲我們一共有多少夸克都關聯到同一個字母。有沒有辦法實現這個仍然使用data.table

+0

請在生成隨機示例數據集之前使用'set.seed'。 – Frank

+0

哦,是的,當然,我的壞。然而,實際的數量在這裏並不重要。 – gented

+0

只是讓我們更容易驗證我們是否獲得了正確的結果。 – Frank

回答

3

您可以通過鏈接一個新的概要中,你只能按letters你的第一個概要如下做到這一點:

dfnew <- df[,.(count = sum(measures)), by = list(letters, quarks) 
      ][, lettercount := sum(count) , by = letters] 

這給:

> dfnew 
    letters quarks count lettercount 
1:  A strange 16   30 
2:  A down  8   30 
3:  A  top  5   30 
4:  A charme  1   30 
5:  B strange 13   43 
6:  B bottom  9   43 
7:  B  top 14   43 
8:  B charme  6   43 
9:  B down  1   43 
10:  C charme 24   73 
11:  C  up  7   73 
12:  C down 11   73 
13:  C strange 18   73 
14:  C  top  3   73 
15:  C bottom 10   73 
16:  D down  8   41 
17:  D charme  3   41 
18:  D bottom  7   41 
19:  D  up 10   41 
20:  D strange  4   41 
21:  D  top  9   41 
22:  E charme 12   77 
23:  E  up  8   77 
24:  E  top  8   77 
25:  E strange 21   77 
26:  E bottom 13   77 
27:  E down 15   77 
28:  F bottom 14   45 
29:  F down 11   45 
30:  F  up 10   45 
31:  F strange  8   45 
32:  F charme  2   45 

如果你想有一個比(像@阿倫在他的回答中顯示的)而不是通過信函的總和,你可以用ratio := count/sum(count)代替lettercount := sum(count)


二手數據:

set.seed(1) 
letters <- sample (LETTERS[1:6], 100, replace = TRUE) 
quarks <- sample(c("up", "down", "charme", "strange", "top", "bottom"), 
        100, replace = TRUE) 
measures<- sample(seq(1:6), 100, replace = TRUE) 

df <- data.table(letters, quarks, measures)[order(letters)] 
+0

我不知道鏈接'[。,]'的可能性。確實非常強大! – gented

2

另一種方式是組使用.SD如下各組內:

require(data.table) 
ans = df[, .(ratio=.SD[, .(tmp=sum(measures)), by=quarks]$tmp/sum(measures)), by=letters] 
head(ans) 
# letters  ratio 
# 1:  C 0.20588235 
# 2:  C 0.13235294 
# 3:  C 0.35294118 
# 4:  C 0.04411765 

我還是更喜歡由@Jaap所示的答案,除了我們可以直接獲取該比例而不是創建字母計數列。

+0

也許在結果中需要一個'quarks' col,並且可能需要添加一個'#...'行來說明結果有更多的行。 – Frank

+0

我也這麼想過;然而,通過這種方式,沒有夸克名稱的分類(而是出現管道兩個'[。,]'),是嗎? – gented

+0

我的版本是'count_df < - df [,{sum {measure(); sum(measures);}} \t temp_df \t \t = .SD [,。(n_letq = sum(measure)),by =夸克]; \t C( \t \t temp_df, \t \t列表( \t \t \t n_let \t \t = n_let, \t \t \t frac_letq \t = temp_df $ n_letq/n_let \t \t) \t) },由=字母] '但我認爲它太長而且很難發佈。 – Frank