创建一个变量,按组捕获最频繁出现的事件

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 是一个错字,当我运行它时,我得到NAs 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 以了解随机中断关系的选项。

【讨论】:

以上是关于创建一个变量,按组捕获最频繁出现的事件的主要内容,如果未能解决你的问题,请参考以下文章

r - 有效地创建变量,指示日期变量是否在事件之前(按组)

事件的阶段---捕获,冒泡

jQuery事件捕获停止传播

在完全正确的参数列表后出现未捕获的语法错误:缺少)。

事件流 事件冒泡和事件捕获

事件流事件冒泡和事件捕获