【问题标题】:group_by, get most frequent and second most frequentgroup_by,获得最频繁和第二频繁
【发布时间】:2020-09-20 17:40:45
【问题描述】:

我有以下数据集:

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

我想得到 b 中任何 a 的最频繁值和 b 中任何 a 的第二频繁值。如果 b 中的两个值具有相同的频率,我对两者中的任何一个被视为“第一”或“第二”无动于衷。

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

d2:

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

如您所见,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)

我目前尝试的是以下

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

但它不能正常工作,有什么想法吗?

【问题讨论】:

    标签: r group-by dplyr summarize


    【解决方案1】:

    您可以为ab 组合的count 行数以及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    
    

    【讨论】:

    • 很好的解决方案,谢谢!我也尝试使用“count”,但只是在“b”上使用 group_by(a);我根本没想过使用排序!
    【解决方案2】:

    这是data.table的一个选项

    library(data.table)
    setDT(d)[, .N, .(a, b)][order(N), .(first = first(b), second = b[2]), a]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-10
      • 1970-01-01
      • 1970-01-01
      • 2021-03-29
      • 2021-04-21
      • 1970-01-01
      • 2018-10-01
      • 2018-07-13
      相关资源
      最近更新 更多