2015-04-28 11 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 

Chcę grupy o zmiennej a i powrócić najczęstszą wartość bPowrót najczęstszą ciąg wartości dla każdej grupy

Moja pożądany wynik będzie wyglądać

a b 
1 1 B 
2 2 B 

W dplyr miałoby to być czymś takim jak

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

Wspomniałem dplyr tylko w celu wizualizacji problemu.

+2

OK, znalazłem to sam 'df%>% group_by (a)%>% summary (b = names (which.max (table (b))))' – rmuc8

Odpowiedz

17

kluczem jest, aby rozpocząć grupowanie zarówno a i b obliczyć częstotliwości, a następnie podjąć tylko najczęstszą każdej grupy a, na przykład tak:

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 

Oczywiście istnieją inne sposoby, więc jest to tylko jeden z możliwych „klucz”.

2

by() każda wartość a utwórz table() z b i wyodrębnić names() z największych pozycji w tym table():

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

Można owinąć to w as.table() uzyskać ładniejszą wyjście, choć wciąż nie nie dokładnie dopasować pożądany rezultat:

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