30
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只是为了可视化问题。

4

3 回答 3

31

关键是开始按两者进行分组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

当然还有其他方法,所以这只是一个可能的“关键”。

于 2015-04-28T14:25:27.100 回答
6

对我有用或更简单的是:

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
于 2018-11-08T20:23:31.083 回答
3

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
于 2015-04-28T14:25:20.280 回答