定义:
df1 <-data.frame(
id=c(rep(1,3),rep(2,3)),
v1=as.character(c("a","b","b",rep("c",3)))
)
s.t。
> df1
id v1
1 1 a
2 1 b
3 1 b
4 2 c
5 2 c
6 2 c
我想创建第三个变量freq
,其中包含v1
id
> df2
id v1 freq
1 1 a b
2 1 b b
3 1 b b
4 2 c c
5 2 c c
6 2 c c
中最常见的观察结果。
{{1}}
答案 0 :(得分:3)
您可以使用ddply
和自定义函数来选择最常用的值:
myFun <- function(x){
tbl <- table(x$v1)
x$freq <- rep(names(tbl)[which.max(tbl)],nrow(x))
x
}
ddply(df1,.(id),.fun=myFun)
请注意,which.max
将返回第一次出现的最大值,如果是tie。请参阅nnet
包中的?? which.is.max以获取随机断开关系的选项。
答案 1 :(得分:1)
mode <- function(x) names(table(x))[ which.max(table(x)) ]
df1$freq <- ave(df1$v1, df1$id, FUN=mode)
> df1
id v1 freq
1 1 a b
2 1 b b
3 1 b b
4 2 c c
5 2 c c
6 2 c c
答案 2 :(得分:1)
另一种方法是使用tidyverse
函数:
group_by()
进行分组,然后使用tally()
arrange()
summarize()
和first()
因此:
df1 %>%
group_by(id, v1) %>%
tally() %>%
arrange(id, desc(n)) %>%
summarize(freq = first(v1))
这将为您提供映射(我发现更清洁):
# A tibble: 2 x 2
id freq
<dbl> <fctr>
1 1 b
2 2 c
然后,您可以使用该表格left_join
原始数据框。