2016-03-18 2 views
2

Iは、以下でdplyrで自明data.frameを集約することができる: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]) 

しかし、明確にはあり、この特定の内の任意のものではなく、他にある可能性があります。このデータを集計すると、が見つからないため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(Zの$ bの、Zの$ bの長さ)' – Raad

+1

のような 'tapply'を使用することができ、私は、これは[未解決の問題だと思いますon github](https://github.com/hadley/dplyr/issues/341)。 – JasonAizkalns

答えて

1

これにアプローチする1つの方法は、 "tidyr"のcompleteを使用することです。あなたは、列 "b" を考慮するmutate最初を使用する必要があります。

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でそれらを0に変更することができます。

関連する問題