2016-03-18 59 views
2

我可以聚合data.frame平凡與dplyr具有以下:R:聚合由所有因子水平(存在並且不存在)

z <- data.frame(a = rnorm(20), b = rep(letters[1:4], each = 5)) 

library(dplyr) 

z %>% 
    group_by(b) %>% 
    summarise(out = n()) 

Source: local data frame [4 x 2] 

     b out 
    (fctr) (int) 
1  a  5 
2  b  5 
3  c  5 
4  d  5 

但是,有時數據集可能缺少的因素。在這種情況下,我希望輸出爲0

例如,假設典型數據集應該有5個組。

z$b <- factor(z$b, levels = letters[1:5]) 

但顯然沒有任何在這個特殊,但可能是另一個。我怎樣才能彙總這個數據,所以length缺失factors0

所需的輸出:

Source: local data frame [4 x 2] 

     b out 
    (fctr) (int) 
1  a  5 
2  b  5 
3  c  5 
4  d  5 
5  e  0 
+0

你可以用'tapply'這樣'tapply(Z $ B,Z $ B,長度)' – Raad

+1

我覺得這是一個[未決問題在github上](https://github.com/hadley/dplyr/issues/341)。 – JasonAizkalns

回答

1

解決此問題的一種方法是使用「tidyr」中的complete。你必須使用mutate第一個因素 「B」 列:

library(dplyr) 
library(tidyr) 

z %>% 
    mutate(b = factor(b, letters[1:5])) %>% 
    group_by(b) %>% 
    summarise(out = n()) %>% 
    complete(b, fill = list(out = 0)) 
# Source: local data frame [5 x 2] 
# 
#  b out 
# (fctr) (dbl) 
# 1  a  5 
# 2  b  5 
# 3  c  5 
# 4  d  5 
# 5  e  0 
1

一個解決辦法是用包含表參加所有級別:

z <- full_join(z, data.frame(b=levels(z$b)) 

這將設置所有缺少的行爲您的分析變量NA,這在一般情況下比將它們設置爲零更有意義。您可以根據需要將它們更改爲零,並使用z[is.na(z)] <- 0