2016-07-05 61 views
4

dplyr的總結功能顯然不包括「模式」選項。基於下面的簡單數據框示例,我想確定每個「類別」組的模式或最頻繁重複的數字。所以對於組「A」,模式是22,對於「B」,它是12和14,並且「C」沒有重複的數字。使用Dplyr「group_by」和「Summarize」以及一個自定義函數來計算多個組的模式

我在網上找到了一些函數的例子,但沒有提到組中沒有重複數字的情況。是否需要自定義函數,或者是否存在某個模式選項?我不想依賴任何其他專門的軟件包只是爲了他們的模式功能。使用R,dplyr,tidy等組合可以很好地找到一個優雅和簡單的解決方案。

如果使用自定義函數,那麼在沒有重複數字時它必須工作,以及當有多個同樣重複的數字時。

任何幫助將不勝感激!這似乎應該是R中的一個簡單解決方案,所以我很驚訝地發現沒有簡單的summarise_each(funs(模式)...選項)

如果使用自定義函數,請將其分解解釋。我還是比較新的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

感謝您的快速答覆。我嘗試過這個功能,但對於組「C」,這沒有按」沒有任何重複的數字,它會返回一個8.沒有辦法返回一些東西來表明什麼時候沒有重複的數字BER?此外,組「B」有兩個數字,每個重複兩次,所以我想它默認返回最低數字。如果有多個模式,是否有辦法返回兩個數字?這可能會問太多......但我真的很想知道什麼時候沒有重複的數字......如果可能的話...... – Mike

+1

@Mike你想爲C組做什麼? – akrun

+0

@Mike請檢查更新是否有幫助 – akrun

相關問題