创建一个变量,按组捕获最频繁出现的事件
Posted
技术标签:
【中文标题】创建一个变量,按组捕获最频繁出现的事件【英文标题】:Create a variable capturing the most frequent occurence by group 【发布时间】:2011-09-24 16:43:56 【问题描述】:定义:
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
by id
s.t. 中最常见的观察结果
> 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
【问题讨论】:
在 id group 中应该如何处理关系? @Chase 在我的情况下,我确信没有关系。 关于领带的好问题,我会记下我的解决方案如何处理这个问题... 【参考方案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
您的原始数据框。
【讨论】:
我喜欢这种方法,因为可以在tally()
之后检查和识别关系。 @joran 的强大功能也有可能做到这一点,但不像这里那么简单,至少对我而言【参考方案2】:
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
【讨论】:
我认为df2
是一个错字,当我运行它时,我得到NA
s for id
=2。
错字不见了,但我仍然认为这段代码不起作用。当id=2时,max(table(x))返回3,但是table(x)只有1个名字,所以你的函数模式返回NA。
由于意外因素,意外给出了正确的结果。 df$id 是一个因素,第三级是“c”。固定。【参考方案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
将返回最大值的第一次出现,在平局的情况下。请参阅 nnet
包中的 ??which.is.max 以了解随机中断关系的选项。
【讨论】:
以上是关于创建一个变量,按组捕获最频繁出现的事件的主要内容,如果未能解决你的问题,请参考以下文章