创建一个捕获组最常出现的变量

时间:2011-06-28 21:38:21

标签: r count frequency data-manipulation data-management

定义:

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}}

3 个答案:

答案 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原始数据框。