【问题标题】:Filter top n largest groups in data.frame过滤 data.frame 中前 n 个最大的组
【发布时间】:2019-10-15 05:15:09
【问题描述】:

对于示例数据:

set.seed(2222)
example_data <- data.frame(col1 = 1:15,
                           col2 = 16:30, 
                           group = sample(1:3, 15, replace = TRUE))

   col1 col2 group
1     1   16     2
2     2   17     1
3     3   18     3
4     4   19     2
5     5   20     3
6     6   21     1
7     7   22     3
8     8   23     1
9     9   24     3
10   10   25     1
11   11   26     2
12   12   27     2
13   13   28     2
14   14   29     3
15   15   30     3

我想找到记录数最多的前 n 个组。

假设我想获得记录数最多的前 2 个组。在数据中,这将是第 3 组和第 2 组:

example_data %>% 
  group_by(group) %>% 
  summarise(n = n())

# A tibble: 3 x 2
  group     n
  <int> <int>
1     1     4
2     2     5
3     3     6

预期的输出是:

   col1 col2 group
1     1   16     2
2     3   18     3
3     4   19     2
4     5   20     3
5     7   22     3
6     9   24     3
7    11   26     2
8    12   27     2
9    13   28     2
10   14   29     3
11   15   30     3

【问题讨论】:

  • 有非常相似的问题有非常相似的答案herehere
  • 类似,但一个查找组内的前 n 个,另一个过滤固定大小的组。

标签: r


【解决方案1】:

我们可以使用table 来计算每个groupsort 的频率,按decreasing 的顺序,将前2 个条目和filter 分别分组。

library(dplyr)

example_data %>%
   filter(group %in% names(sort(table(group), decreasing = TRUE)[1:2]))


#   col1 col2 group
#1     1   16     2
#2     3   18     3
#3     4   19     2
#4     5   20     3
#5     7   22     3
#6     9   24     3
#7    11   26     2
#8    12   27     2
#9    13   28     2
#10   14   29     3
#11   15   30     3

你也可以直接在base R中使用它subset

subset(example_data, group %in% names(sort(table(group), decreasing = TRUE)[1:2]))

【讨论】:

    【解决方案2】:

    我们可以为此使用tidyverse 方法。创建一个频率列,其中包含add_countarrange 按该列和filter 'group' 在最后两个 unique 'group' 值中的行

    library(dplyr)
    example_data %>% 
       add_count(group) %>% 
       arrange(n) %>%
       filter(group %in% tail(unique(group), 2)) %>%
       select(-n)
    # A tibble: 11 x 3
    #    col1  col2 group
    #  <int> <int> <int>
    # 1     1    16     2
    # 2     4    19     2
    # 3    11    26     2
    # 4    12    27     2
    # 5    13    28     2
    # 6     3    18     3
    # 7     5    20     3
    # 8     7    22     3
    # 9     9    24     3
    #10    14    29     3
    #11    15    30     3
    

    或使用data.table

    library(data.table)
    setDT(example_data)[group %in% example_data[, .N, group][order(-N), head(group, 2)]]
    

    【讨论】:

      【解决方案3】:

      使用dplyr,您还可以:

      example_data %>%
       add_count(group) %>%
       filter(dense_rank(desc(n)) <= 2) %>%
       select(-n)
      
         col1  col2 group
         <int> <int> <int>
       1     1    16     2
       2     3    18     3
       3     4    19     2
       4     5    20     3
       5     7    22     3
       6     9    24     3
       7    11    26     2
       8    12    27     2
       9    13    28     2
      10    14    29     3
      11    15    30     3
      

      或者:

      example_data %>%
       add_count(group) %>%
       slice(which(dense_rank(desc(n)) <= 2)) %>%
       select(-n)
      

      【讨论】:

        【解决方案4】:

        另一个dplyr 方法可能是:

        example_data %>% 
          group_by(group) %>% 
          count() %>% 
          ungroup() %>% 
          top_n(n = 2, wt = n) %>% 
          select(-n) %>% 
          inner_join(example_data)
        

        【讨论】:

          【解决方案5】:

          另一种解决方案(类似于@OTStats):

          library(dplyr)
          
          example_data %>% 
            inner_join(
              count(., group) %>% top_n(2, n) %>% dplyr::select(group)
              )
          
          #    col1 col2 group
          # 1     1   16     2
          # 2     3   18     3
          # 3     4   19     2
          # 4     5   20     3
          # 5     7   22     3
          # 6     9   24     3
          # 7    11   26     2
          # 8    12   27     2
          # 9    13   28     2
          # 10   14   29     3
          # 11   15   30     3
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-06-11
            • 2023-03-29
            • 1970-01-01
            • 1970-01-01
            • 2017-03-02
            • 2022-01-26
            相关资源
            最近更新 更多