2017-10-13 109 views
0

我想計算相對於其餘組的相對頻率的一組值。例如,計算am==0gear==3的相對頻率。我使用以下方式計算。incurbtent相對頻率輸出與總結和變異

library(dplyr) 

mtcars %>% 
    select(am, gear) %>% 
    group_by(am, gear) %>% 
    summarise(N = n()) %>% 
    group_by(am) %>% 
    mutate(freq = N/sum(N)) 

# Source: local data frame [4 x 4] 
# Groups: am [2] 
# 
# # A tibble: 4 x 4 
#  am gear  N  freq 
# <dbl> <dbl> <int>  <dbl> 
# 1  0  3 15 0.7894737 
# 2  0  4  4 0.2105263 
# 3  1  4  8 0.6153846 
# 4  1  5  5 0.3846154 

上述輸出爲預期。但是,我想將freq值作爲原始數據集中具有相同值的新列。我嘗試了下面的方法來計算計數Ǹ,然後計算相對頻率freq

mtcars %>% 
    select(am, gear) %>% 
    group_by(am, gear) %>% 
    mutate(N = n()) %>% 
    group_by(am) %>% 
    mutate(freq = N/sum(N)) 

# Source: local data frame [32 x 4] 
# Groups: am [2] 
# 
# # A tibble: 32 x 4 
#  am gear  N  freq 
# <dbl> <dbl> <int>  <dbl> 
# 1  1  4  8 0.08988764 
# 2  1  4  8 0.08988764 
# 3  1  4  8 0.08988764 
# 4  0  3 15 0.06224066 
# 5  0  3 15 0.06224066 
# 6  0  3 15 0.06224066 
# 7  0  3 15 0.06224066 
# 8  0  4  4 0.01659751 
# 9  0  4  4 0.01659751 
# 10  0  4  4 0.01659751 
# # ... with 22 more rows 

現在,它給出了不同的輸出。可能是什麼原因?

+1

那麼,sum(N)總結的總和比mutate小,因此第二次嘗試的值要小得多。你可以在最後一行嘗試'mutate(freq = N/sum(unique(N)))'但它不是很安全 – Sotos

+0

'group_by(am)'不會限制它只在該組中進行計數? 'sum(unique(N))'錯過了真正的重複,我的意思是頻繁的'am-gear'組合。隨着數量的增加,即使這個數值的份額線性增加。所以,我認爲它在相對頻率計算中沒有區別。 – Prradep

+0

它的確如此。但是你們的小組現在變得更大,因爲它們是變異而不是總結的結果。它在rel.freq中有所不同的原因。是因爲你的'N'在兩種情況下都是一樣的 – Sotos

回答

2

您需要重新計算的N個大小爲AM組以及:

mtcars %>% 
    select(am, gear) %>% 
    group_by(am, gear) %>% 
    mutate(N = n()) %>% 
    group_by(am) %>% 
    mutate(freq = N/n()) 

這樣可以得到預期的結果

3

一個更好的選擇是left_join與總的輸出(「水庫」)

mtcars %>% 
     select(am, gear) %>% 
     left_join(., res) 

如果我們看一下sum(N)實在是有點較大的值,因爲有更多的行數

+0

我很感謝你的回答。但是,我基本上想知道那裏出了什麼問題並理解。就我個人而言,我不想爲此操作創建另一個對象'res'。 – Prradep

+0

@Prradep假設有100行,我們在每個組的第二個案例中總結了所有元素的數量,但第一種方法只有幾行 – akrun

+0

隨着數量的增加,即使這個值的份額線性增加。所以,我認爲它在相對頻率計算中沒有區別。 – Prradep