2016-07-05 5 views
4

明らかにdplyrのsummarize関数には "mode"のオプションは含まれていません。以下の単純なデータフレームの例に基づいて、「カテゴリ」の各グループのモードまたは最も頻繁に繰り返す番号を決定したいと考えています。グループ "A"の場合、モードは22、 "B"は12と14、繰り返し番号は "C"にはありません。Dplyr "group_by"と "Summarize"といくつかのグループのモードを計算するためのカスタム関数の使用

オンラインで機能の例がいくつか見つかりましたが、グループ内に繰り返し番号がない場合の状況はありませんでした。カスタム関数が必要か、どこかにモードオプションがありますか?私は彼らのモード機能のためだけに、他の専門パッケージに頼るつもりはありません。ベースR、dplyr、tidyなどの組み合わせを使用してエレガントでシンプルなsolutioinを見つけることはいいでしょう。

カスタム関数を使用する場合、等しく繰り返される数が複数ある場合。

ご協力いただければ幸いです!これはRの簡単なsolutioinのように思われるので、単純なsummarise_each(funs(mode)...)オプションがないことに驚いた。

カスタム関数を使用する場合は、説明。私はまだRの機能への比較的新しいです。

Category<-c("A","B","B","C","A","A","A","B","C","B","C","C") 
Number<-c(22,12,12,8,22,22,18,14,10,14,1,3) 
DF<-data.frame(Category,Number) 

答えて

4

我々は、高速応答のための

Mode <- function(x) { 
    ux <- unique(x) 
    if(!anyDuplicated(x)){ 
     NA_character_ } else { 
    tbl <- tabulate(match(x, ux)) 
    toString(ux[tbl==max(tbl)]) 
} 
} 

DF %>% 
    group_by(Category) %>% 
    summarise(NumberMode = Mode(Number)) 
# Category NumberMode 
# <fctr>  <chr> 
#1  A   22 
#2  B  12, 14 
#3  C  <NA> 
+0

感謝を使用することができます。私は前にこの機能を試してみましたが、「doesnのグループ「C」、のために繰り返し数がない場合は8を返します。繰り返しnumがない場合を示すために何かを返す方法はありませんベール?また、グループ "B"にはそれぞれ2回繰り返す2つの数字があるので、デフォルトでは最小の数字が返ってくると思います。複数のモードがある場合、両方の数値を返す方法はありますか?これはあまりにも多くを求めているかもしれません...しかし、私は本当に可能な場合は繰り返し番号がないときに知りたいです... – Mike

+1

@MikeグループCのために何をしたいですか? – akrun

+0

@Mikeアップデートが役に立っているかどうか確認してください – akrun

関連する問題