7

定义:

df1 <-data.frame(
id=c(rep(1,3),rep(2,3)),
v1=as.character(c("a","b","b",rep("c",3)))
)

英石

> df1
  id v1
1  1  a
2  1  b
3  1  b
4  2  c
5  2  c
6  2  c

我想创建第三个变量,其中包含stfreq中最常见的观察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
4

3 回答 3

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在平局的情况下,将返回最大值的第一次出现。请参阅包中的 ??which.is.max 以nnet了解随机中断关系的选项。

于 2011-06-28T21:51:40.540 回答
3

另一种方法包括使用tidyverse函数:

  • 首先使用 进行分组group_by(),并使用 计算第二个变量的出现次数tally()
  • 按出现次数排列arrange()
  • summarize()用and总结和挑选第一行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使用该表使用您的原始数据框。

于 2017-11-14T11:39:30.363 回答
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
于 2011-06-28T22:04:30.900 回答