首页 文章

如何在dplyr中使用group_indices标记具有组编号的双重分组数据框?

提问于
浏览
0

此问题与其他用户发布的以下问题有关:

How to number/label data-table by group-number from group_by?

Numbering of groups in dplyr?

我的方法的一部分是'inspired'由krlmlr回答这个主题:https://github.com/tidyverse/dplyr/issues/1185


问题:

我有 data.frame 类似于以下内容:

db <- data.frame(ID = c(rep(1, 5), rep(2, 5)),
                  date = as.Date(c(
                    rep("2001-01-01", 3),
                    "2001-01-03",
                    "2001-01-03",
                    rep("2011-01-01", 2),
                    rep("2010-03-12", 2),
                    "2001-01-01"
                  )))

db
#       ID       date
#    1   1 2001-01-01
#    2   1 2001-01-01
#    3   1 2001-01-01
#    4   1 2001-01-03
#    5   1 2001-01-03
#    6   2 2011-01-01
#    7   2 2011-01-01
#    8   2 2010-03-12
#    9   2 2010-03-12
#    10  2 2001-01-01

我的目标是按ID和日期进行分组,并在db中创建一个新列,指示每个ID中日期的顺序 . 该解决方案将是db的新列,其值为 c(1, 1, 1, 2, 2, 3, 3, 2, 2, 1)

我尝试的两种方法会对所有ID中的日期进行排名,但不会在每个ID中排名(见下文) .

我能做什么?

非常感谢你 .


自己的方法

db %>% 
   group_by(ID, date) %>% 
   { mutate(ungroup(.), rank = group_indices(.)) }
## A tibble: 10 x 3
#      ID       date  rank
#   <dbl>     <date> <int>
# 1     1 2001-01-01     1
# 2     1 2001-01-01     1
# 3     1 2001-01-01     1
# 4     1 2001-01-03     2
# 5     1 2001-01-03     2
# 6     2 2011-01-01     5
# 7     2 2011-01-01     5
# 8     2 2010-03-12     4
# 9     2 2010-03-12     4
#10     2 2001-01-01     3

db %>% 
   mutate(label = group_indices(., ID, date))
#   ID       date label
#1   1 2001-01-01     1
#2   1 2001-01-01     1
#3   1 2001-01-01     1
#4   1 2001-01-03     2
#5   1 2001-01-03     2
#6   2 2011-01-01     5
#7   2 2011-01-01     5
#8   2 2010-03-12     4
#9   2 2010-03-12     4
#10  2 2001-01-01     3

1 回答

  • 1

    我们可以使用 dense_rank .

    library(dplyr)
    
    db2 <- db %>%
      group_by(ID) %>%
      mutate(rank = dense_rank(date)) %>%
      ungroup()
    db2
    # # A tibble: 10 x 3
    #      ID date        rank
    #   <dbl> <date>     <int>
    #  1    1. 2001-01-01     1
    #  2    1. 2001-01-01     1
    #  3    1. 2001-01-01     1
    #  4    1. 2001-01-03     2
    #  5    1. 2001-01-03     2
    #  6    2. 2011-01-01     3
    #  7    2. 2011-01-01     3
    #  8    2. 2010-03-12     2
    #  9    2. 2010-03-12     2
    # 10    2. 2001-01-01     1
    

相关问题