Return 每组最常见的字符串值
Return most frequent string value for each group
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
和 return 最常见的值 b
进行分组
我想要的结果看起来像
a b
1 1 B
2 2 B
在dplyr
中会是这样的
df %>% group_by(a) %>% summarize (b = most.frequent(b))
我提到 dplyr
只是为了形象化问题。
by()
a
的每个值,创建 b
的 table()
并提取 table()
中最大条目的 names()
]:
> 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
关键是开始按 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
当然还有其他方法,所以这只是一种可能"key"。
对我有用或更简单的是:
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
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
和 return 最常见的值 b
我想要的结果看起来像
a b
1 1 B
2 2 B
在dplyr
中会是这样的
df %>% group_by(a) %>% summarize (b = most.frequent(b))
我提到 dplyr
只是为了形象化问题。
by()
a
的每个值,创建 b
的 table()
并提取 table()
中最大条目的 names()
]:
> 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
关键是开始按 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
当然还有其他方法,所以这只是一种可能"key"。
对我有用或更简单的是:
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