Возврат наиболее частого строкового значения для каждой группы
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
только для визуализации проблемы.
Ответы
Ответ 1
Ключ состоит в том, чтобы начать группировку как с 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
Ответ 3
Что работает для меня или проще:
df %>% group_by(a) %>% slice(which.max(table(b)) )
df %>% group_by(a) %>% count(b) %>% top_n(1)