如何在 dplyr 中用 group_indices 标记带有组号的双分组数据框?

How to label a double grouped data frame with a group number with group_indices in dplyr?

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

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

我的部分方法是 '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 和日期分组并在数据库中创建一个新列,指示每个 ID 中的日期顺序。解决方案是使用值 c(1, 1, 1, 2, 2, 3, 3, 2, 2, 1)

到 db 的新列

我尝试的两种方法将对所有 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

我们可以使用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