【问题标题】:R: Grouping in a hierarchyR:在层次结构中分组
【发布时间】:2018-08-25 14:16:27
【问题描述】:

我正在处理一个带有六位数分组系统的数据集。前两位表示顶层的分组,后两位表示不同的子组,最后两位表示子组内的特定类型。我想将数据分组到层次结构的顶层(仅前两位数字),并计算每个组中的唯一名称。

GroupID 010203 的示例:

  • 01 表示宝马
  • 02 表示 3 系列
  • 03 表示 320i(具体型号)

在这个例子中我只关心每个品牌有多少。

玩具数据集和想要的输出:

df <- data.table(Quarter = c('Q4', 'Q4', 'Q4', 'Q4', 'Q3'),
                 GroupID = c(010203, 150503, 010101, 150609, 010000),
                 Name = c('AAAA', 'AAAA', 'BBBB', 'BBBB', 'CCCC'))

输出:

Quarter     Group     Counts
Q3          01        1
Q4          01        2
Q4          15        2

【问题讨论】:

    标签: r grouping hierarchy


    【解决方案1】:

    使用data.table 我们可以做到:

    library(data.table)
    
    dt[, Group := substr(GroupID, 1, 2)][
       , Counts := .N, by = list(Group, Quarter)][
       , head(.SD, 1), by = .(Quarter, Group, Counts)][
       , .(Quarter, Group, Counts)]
    

    返回:

       Quarter Group Counts
    1:      Q4    01      2
    2:      Q4    15      2
    3:      Q3    01      1
    

    使用dplyr 和stringr,我们可以这样做:

    library(dplyr)
    library(stringr)
    
    df %>% 
      mutate(Group = str_sub(GroupID, 1, 2)) %>% 
      group_by(Group, Quarter) %>% 
      summarise(Counts = n()) %>% 
      ungroup()
    

    返回:

    # A tibble: 3 x 3
      Group Quarter Counts
      <chr> <fct>    <int>
    1 01    Q3           1
    2 01    Q4           2
    3 15    Q4           2
    

    【讨论】:

      【解决方案2】:

      既然你已经在使用data.table,你可以这样做:

      df[, Group := substr(GroupID,1,2)]
      df <- df[,Counts := .N, .(Group,Quarter)][,.(Group, Quarter, Counts)]
      df <- unique(df)
      print(df)
      
         Group Quarter Counts
      1:    10      Q4      2
      2:    15      Q4      2
      3:    10      Q3      1
      

      【讨论】:

        【解决方案3】:

        这是我使用plyr 和base R 的简单解决方案,速度很快。

        library(plyr)
        df$breakid <- as.character((substr(df$GroupID, start =0 , stop = 2)))
        d <- plyr::count(df, c("Quarter", "breakid"))
        

        结果

         Quarter breakid freq
              Q3      01    1
              Q4      01    2
              Q4      15    2
        

        【讨论】:

          【解决方案4】:

          或者,使用tapply(和data.table索引):

          df$Brand <- substr(df$GroupID, 1, 2)
          tapply(df$Brand, df[, .(Quarter, Brand)], length)
          

          (如果您不关心输出是矩阵)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2020-11-30
            • 2014-03-01
            • 1970-01-01
            • 2019-06-15
            • 2016-08-07
            • 2015-12-16
            • 2016-04-11
            相关资源
            最近更新 更多