最常见的值(模式)按组

Asi*_*eel 6 r

我试图通过小组找到最频繁的价值.在以下示例数据框中:

df<-data.frame(a=c(1,1,1,1,2,2,2,3,3),b=c(2,2,1,2,3,3,1,1,2))  
> df  
  a b  
1 1 2  
2 1 2  
3 1 1  
4 1 2  
5 2 3  
6 2 3  
7 2 1  
8 3 1  
9 3 2  
Run Code Online (Sandbox Code Playgroud)

我想添加一个列'c',当其值按'a'分组时,'b'中出现的值最多.我想要以下输出:

> df  
  a b c  
1 1 2 2    
2 1 2 2    
3 1 1 2    
4 1 2 2    
5 2 3 3    
6 2 3 3    
7 2 1 3    
8 3 1 1   
9 3 2 1    
Run Code Online (Sandbox Code Playgroud)

我尝试使用table和tapply,但没有把它弄好.有没有快速的方法来做到这一点?
谢谢!

akr*_*run 8

我们可以使用 'a' 获得按 'a' 分组的 'b' 的 'Mode' ave

 Mode <- function(x) {
 ux <- unique(x)
 ux[which.max(tabulate(match(x, ux)))]
}

df$c <-  with(df, ave(b, a, FUN=Mode))
df$c
#[1] 2 2 2 2 3 3 3 1 1
Run Code Online (Sandbox Code Playgroud)

或使用 data.table

library(data.table)
setDT(df)[, c:= Mode(b), by=a][]
Run Code Online (Sandbox Code Playgroud)


dim*_*_ps 8

在Davids评论的基础上,您的解决方案如下:

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

library(dplyr)
df %>% group_by(a) %>% mutate(c=Mode(b))
Run Code Online (Sandbox Code Playgroud)

当尽管这为平手注意df$a3那么的方式b1.