group_by,获取最频繁和第二频繁的

Car*_*rbo 4 group-by r dplyr summarize

我有以下数据集:

a   b

1   a           
1   a           
1   a           
1   none            
2   none            
2   none            
2   b           
3   a           
3   c           
3   c
3   d
4   a
Run Code Online (Sandbox Code Playgroud)

我想获取任何 a 的 b 中最频繁的值以及任何 a 的 b 的第二频繁值。如果 b 中的两个值具有相同的频率,我对这两个值中的任何一个被视为“第一”或“第二”不关心。

在这种情况下,预期输出将是:

d2:

a    first    second 
1    a        none
2    none     b
3    c        a(or d, doesn't matter)
4    a        NA
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,a=4 在 b 中只有一个值,因此我预计输出列“第二”中为 NA,因为没有第二个最常见的值。

数据:

a <- c(1,1,1,1,2,2,2,3,3,3,3,4)
b<- c("a","a", "a", "none", "none", "none", "b", "a", "c" , "c",  "d","a")  
d <-  data.frame(a,b)
Run Code Online (Sandbox Code Playgroud)

我现在尝试的是以下内容

d1 <-  d %>% group_by(a) %>% summarize ( first =names(which.max(table(b)))  , second= names(which.max(table(b)[-which.max(table(b))] )))
Run Code Online (Sandbox Code Playgroud)

但它无法正常工作,您知道如何做到这一点吗?

Ron*_*hah 8

您可以count选择行数ab组合,并为a中的每个值选择第一个和第二个值summarise

library(dplyr)
 d %>%
  count(a, b, sort = TRUE) %>%
  group_by(a) %>%
  summarise(first = b[1],second = b[2])


# A tibble: 4 x 3
#      a first second
#  <dbl> <chr> <chr> 
#1     1 a     none  
#2     2 none  b     
#3     3 c     a     
#4     4 a     NA    
Run Code Online (Sandbox Code Playgroud)