我试图通过小组找到最频繁的价值.在以下示例数据框中:
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,但没有把它弄好.有没有快速的方法来做到这一点?
谢谢!
我们可以使用 '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)
在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$a是3那么的方式b是1.
| 归档时间: |
|
| 查看次数: |
7638 次 |
| 最近记录: |