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

Я хочу, чтобы сгруппировать по переменной a и возвращает наиболее частое значение bВозврат наиболее часто встречающееся значение строки для каждой группы

Мой желаемый результат будет выглядеть

a b 
1 1 B 
2 2 B 

В dplyr было бы что-то вроде

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

Я упомянул dplyr только для визуализации проблемы.

+2

ОК, я сам нашел его 'df%>% group_by (a)%>% summary (b = names (which.max (table (b))))' – rmuc8

ответ

17

ключ должен начать группировать обоими a и b вычислить частоты, а затем принимать только наиболее часто на группу a, например так:

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 

Конечно, существуют и другие подходы, так что это только один возможный «ключ».

2

by() каждое значение a, создать table() из b и извлечь names() крупнейшей запись в этом table():

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

Вы можете обернуть это в as.table(), чтобы получить покрасивее выход, хотя он по-прежнему делает не точно соответствовать вашему желаемому результату:

> as.table(with(df,by(b,a,function(xx)names(which.max(table(xx)))))) 
a 
1 2 
B B 
Смежные вопросы