web-dev-qa-db-ja.com

各グループの最も頻繁な文字列値を返します

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について言及しました。

22
rmuc8

重要なのは、abの両方でグループ化を開始して頻度を計算し、次に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

もちろん、他のアプローチもあるので、これは可能な「キー」の1つにすぎません。

28
talat

私にとってうまくいくか、またはより簡単です:

df %>% group_by(a) %>% slice(which.max(table(b)) ) # ignores ties, see below

df %>% group_by(a) %>% count(b) %>% top_n(1) # includes ties

library(data.table)
DT<-as.data.table(df)
DT[ , .N, by=.(a, b)][
  order(-N), 
  .SD[ N == max(N) ]
  ,by=a]                     # includes ties
4
Ferroao

by()aの各値、btable()を作成し、その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
Stephan Kolassa