2015-04-28 7 views
10
a <- c(rep(1:2,3)) 
b <- c("A","A","B","B","B","B") 
df <- data.frame(a,b) 

> str(b) 
chr [1:6] "A" "A" "B" "B" "B" "B" 

    a b 
1 1 A 
2 2 A 
3 1 B 
4 2 B 
5 1 B 
6 2 B 

Voglio gruppo dalla variabile a e restituire il valore più frequente di bRestituisce valore stringa più frequente per ogni gruppo

mio risultato desiderato sarebbe simile

a b 
1 1 B 
2 2 B 

In dplyr sarebbe essere qualcosa come

df %>% group_by(a) %>% summarize (b = most.frequent(b)) 

Ho citato dplyr solo per visualizzare il problema.

+2

OK, l'ho trovato io stesso 'df%>% group_by (a)%>% riepiloga (b = nomi (which.max (tabella (b)))' – rmuc8

risposta

17

La chiave è quello di iniziare il raggruppamento sia a e b per calcolare le frequenze e poi prendere solo il più frequente per gruppo di a, per esempio come questo:

df %>% 
    count(a, b) %>% 
    slice(which.max(n)) 

Source: local data frame [2 x 3] 
Groups: a 

    a b n 
1 1 B 2 
2 2 B 2 

Naturalmente ci sono altri approcci, quindi questo è solo una "chiave" possibile.

2

by() ogni valore di a, creare un table() di b ed estrarre il names() del più grande iscrizione in tale table():

> with(df,by(b,a,function(xx)names(which.max(table(xx))))) 
a: 1 
[1] "B" 
------------------------ 
a: 2 
[1] "B" 

Puoi avvolgere questo in as.table() per ottenere un'uscita più carina, anche se lo fa ancora non corrispondere esattamente il risultato desiderato:

> as.table(with(df,by(b,a,function(xx)names(which.max(table(xx)))))) 
a 
1 2 
B B