2017-04-26 12 views
1

私はa,b,cという3つの列を持つデータフレームdfを持っています。2つの異なる列を連続して使用して集計しgroup_by

df <- data.frame(a = c('a','b','c','d','e','f','g','e','f','g'), 
       b = c('X','Y','Z','X','Y','Z','X','X','Y','Z'), 
       c = c('cat','dog','cat','dog','cat','cat','dog','cat','cat','dog')) 
df 

# output 
    a b c 
1 a X cat 
2 b Y dog 
3 c Z cat 
4 d X dog 
5 e Y cat 
6 f Z cat 
7 g X dog 
8 e X cat 
9 f Y cat 
10 g Z dog 

は、私はそれで利用可能な値の数と列cを使用してsummarise続く列bを使用してgroup_byする必要があります。

df %>% group_by(b) %>% 
    summarise(nCat = sum(c == 'cat'), 
      nDog = sum(c == 'dog')) 
#output 
# A tibble: 3 × 3 
     b nCat nDog 
    <fctr> <int> <int> 
1  X  2  2 
2  Y  2  1 
3  Z  2  1 

しかし、上記の作業を行う前に、私はbに複数の値を持つaの値に属する行を削除する必要があります。

df %>% group_by(a) %>% summarise(count = n()) 
#output 
# A tibble: 7 × 2 
     a count 
    <fctr> <int> 
1  a  1 
2  b  1 
3  c  1 
4  d  1 
5  e  2 
6  f  2 
7  g  2 

例えば、このデータフレームにおいて、値e(値:YX)を有するすべての行の列aで、f(値:ZY)、gXZ値)。

# Expected output 
# A tibble: 3 × 3 
     b nCat nDog 
    <fctr> <int> <int> 
1  X  1  1 
2  Y  0  1 
3  Z  1  0 

答えて

3

我々はsummarise

df %>% 
    group_by(a) %>% 
    filter(n_distinct(b)==1) %>% 
    group_by(b) %>% 
    summarise(nCat =sum(c=='cat'), nDog = sum(c=='dog'), Total = n()) 
# A tibble: 3 × 4 
#  b nCat nDog Total 
# <fctr> <int> <int> <int> 
#1  X  1  1  2 
#2  Y  0  1  1 
#3  Z  1  0  1 
を行い、その後、「B」でグループ化された各「」グループ、1つだけのユニークな要素を持っている「B」の値をフィルタリングする n_distinctfilterを使用することができます
+1

答えをありがとう。最後に合計を加えることは可能でしょうか?つまり、合計猫と総犬ですか?私はこれが質問された質問とは違うが、少しの拡張であることを理解しています。 – Prradep

+0

@Prradep猫と犬だけがあれば 'n()'、それ以外の場合は 'Total = nCat + nDog ') – akrun

+0

もう一度良い提案をありがとう。しかし、私は 'TotalX'、' TotalY'、 'TotalZ'、' TotalCat = 2'、 'TotalDog = 2'の代わりに' TotalCat'と 'TotalDog'を見ることに興味があります。 – Prradep

関連する問題