【问题标题】:Group by multiple columns and ordinally label groups?按多列分组并按顺序标记组?
【发布时间】:2021-05-12 03:22:56
【问题描述】:

我需要按 col1 分组,并且对于 col2 中的每个唯一值,给出一个从 1 开始并从那里向上的整数,但从 1 开始返回 col1 中的下一个唯一值。在示例中更容易看到:

示例

这是一个data.frame。

df <- data.frame(
  col1=c(100, 100, 100, 100, 200, 200, 300, 300, 300),
  col2=c("a", "b", "c", "c",
               "b", "b", 
               "a", "c", "c")
)

df

#   col1 col2
# 1  100    a
# 2  100    b
# 3  100    c
# 4  100    c
# 5  200    b
# 6  200    b
# 7  300    a
# 8  300    c
# 9  300    c

对于 col1 中的每个唯一值(即组),col2 中的每个唯一值(例如组)都应按顺序编号:

期望的输出:

df %>% 
  cbind(col3 =c(1, 2, 3, 3, 
          1, 1, 
          1, 2, 2))


#   col1 col2 col3
# 1  100    a    1
# 2  100    b    2
# 3  100    c    3
# 4  100    c    3
# 5  200    b    1
# 6  200    b    1
# 7  300    a    1
# 8  300    c    2
# 9  300    c    2

请注意,对于每组 col1,col2 中的每个新值都有自己的整数。

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    这里有3种方法-

    library(dplyr)
    
    df %>%
      group_by(col1) %>%
      mutate(col3 = match(col2, unique(col2)), 
             col4 = as.integer(factor(col2)), 
             col5 = dense_rank(col2)) %>%
      ungroup
    
    #   col1 col2   col3  col4  col5
    #  <dbl> <chr> <int> <int> <int>
    #1   100 a         1     1     1
    #2   100 b         2     2     2
    #3   100 c         3     3     3
    #4   100 c         3     3     3
    #5   200 b         1     1     1
    #6   200 b         1     1     1
    #7   300 a         1     1     1
    #8   300 c         2     2     2
    #9   300 c         2     2     2
    

    【讨论】:

      【解决方案2】:

      我们可以使用data.table中的rleid

      library(data.table)
      library(dplyr)
      df %>% 
        group_by(col1) %>%
        mutate(new_col = rleid(col2))
      

      输出:

         col1 col2  new_col
        <dbl> <chr>   <int>
      1   100 a           1
      2   100 b           2
      3   100 c           3
      4   100 c           3
      5   200 b           1
      6   200 b           1
      7   300 a           1
      8   300 c           2
      9   300 c           2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-04
        • 1970-01-01
        • 2016-06-19
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 2021-11-04
        • 1970-01-01
        相关资源
        最近更新 更多