2015-03-25 10 views
5

Sto cercando di trovare il valore più frequente per gruppo. Nel seguente esempio dataframe:Valore più frequente (modalità) per gruppo

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 

desidero aggiungere una colonna 'c' che ha il valore più frequente di 'b' quando i relativi valori sono raggruppati per 'a'. Vorrei il seguente output:

> 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  

Ho provato a usare la tabella e il tapply ma non ho capito bene. C'è un modo veloce per farlo?
Grazie!

+3

Questo è molto correlato a [questo] (http://stackoverflow.com/questions/2547402/standard-library-function-in-r-for-finding-the-mode) –

risposta

5

Costruire su Davids commenta la soluzione è la seguente:

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

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

Si noti però che per il pareggio quando df$a è 3 quindi la modalità per b è 1.

2

siamo riusciti a trovare la 'modalità' di 'b' raggruppati per 'A' utilizzando 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 

o utilizzando data.table

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

Qui è un metodo di base R che utilizza table per calcolare una scheda croce, max.col di trovare il modo per gruppo, e rep insieme rle compilare il modalità tra i gruppi.

# 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 

Si noti che questo presuppone che i dati siano stati ordinati per gruppo. Inoltre, il valore predefinito di max.col consiste nel rompere i legami (modi multipli) a caso. Se si desidera che il primo o l'ultimo valore sia la modalità, è possibile impostarlo utilizzando l'argomento ties.method.

Problemi correlati