2017-11-27 7 views
2

(フィルタリング後の)データフレーム内の各グループの数と割合(すべての要素のうちの)が必要です。このコードは、所望の出力を生成します。dplyrフィルタリング後のグループ全体の行数

library(dplyr) 
df <- data_frame(id = sample(letters[1:3], 100, replace = TRUE), 
       value = rnorm(100)) 

summary <- filter(df, value > 0) %>% 
    group_by(id) %>% 
    summarize(count = n()) %>% 
    ungroup() %>% 
    mutate(proportion = count/sum(count)) 

> summary 
# A tibble: 3 x 3 
    id count proportion 
    <chr> <int>  <dbl> 
1  a 17 0.3695652 
2  b 13 0.2826087 
3  c 16 0.3478261 

ungroup()と第二summarize()ステップを回避するためのエレガントな解決策があります。ような何か:

summary <- filter(df, value > 0) %>% 
    group_by(id) %>% 
    summarize(count = n(), 
       proportion = n()/[?TOTAL_ROWS()?]) 

私はドキュメントのような機能を見つけることができませんでしたが、私は何かを明らかに不足している必要があります。ありがとう!全データフレームを参照

答えて

7

あなたは.nrowを使用することができますがでパイプ:

df %>% 
    filter(value > 0) %>% 
    group_by(id) %>% 
    summarise(count = n(), proportion = count/nrow(.)) 

# A tibble: 3 x 3 
#  id count proportion 
# <chr> <int>  <dbl> 
#1  a 14 0.2592593 
#2  b 22 0.4074074 
#3  c 18 0.3333333 
+1

パーフェクト感謝を! '.'について知らなかった –

+0

あなたは大歓迎です。 – Psidom

関連する問題