2015-03-25 91 views
5

我正在嘗試按組查找最常見的值。在下面的示例數據幀:按組別劃分的最常見值(模式)

df<-data.frame(a=c(1,1,1,1,2,2,2,3,3),b=c(2,2,1,2,3,3,1,1,2)) 
> df 
    a b 
1 1 2 
2 1 2 
3 1 1 
4 1 2 
5 2 3 
6 2 3 
7 2 1 
8 3 1 
9 3 2 

我想增加一列「C」,其具有在「B」的最出現的值時,其值由「A」分組。我想要以下輸出:

> df 
    a b c 
1 1 2 2  
2 1 2 2  
3 1 1 2  
4 1 2 2  
5 2 3 3  
6 2 3 3  
7 2 1 3  
8 3 1 1 
9 3 2 1  

我試過使用表和tapply,但沒有得到它的權利。有沒有一個快速的方法來做到這一點?
謝謝!

+3

這與[this]非常相關(http://stackoverflow.com/questions/2547402/standard-library-function-in-r-for-finding-the-mode) – 2015-03-25 12:25:12

回答

5

大廈戴維斯評論您的解決方案是繼分組的的 'B' '模式':

Mode <- function(x) { 
    ux <- unique(x) 
    ux[which.max(tabulate(match(x, ux)))] 
} 

library(dplyr) 
df %>% group_by(a) %>% mutate(c=Mode(b)) 

注意雖然對於領帶df$a3那麼b的模式是1

2

我們可以得到 'A' 使用ave

Mode <- function(x) { 
ux <- unique(x) 
ux[which.max(tabulate(match(x, ux)))] 
} 

df$c <- with(df, ave(b, a, FUN=Mode)) 
df$c 
#[1] 2 2 2 2 3 3 3 1 1 

或者使用data.table

library(data.table) 
setDT(df)[, c:= Mode(b), by=a][] 
0

下面是一個使用table計算爲交叉的薄片,max.col找到每組模式鹼R法,並用rlerep一起填寫各組的模式。

# calculate a cross tab, frequencies by group 
myTab <- table(df$a, df$b) 
# repeat the mode for each group, as calculated by colnames(myTab)[max.col(myTab)] 
# repeating by the number of times the group ID is observed 
df$c <- rep(colnames(myTab)[max.col(myTab)], rle(df$a)$length) 

df 
    a b c 
1 1 2 2 
2 1 2 2 
3 1 1 2 
4 1 2 2 
5 2 3 3 
6 2 3 3 
7 2 1 3 
8 3 1 2 
9 3 2 2 

請注意,這假定數據已按組排序。此外,max.col的默認值是隨機打破關係(多個模式)。如果你想讓第一個或最後一個值成爲模式,你可以使用tie.method參數來設置它。