如何在 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
此问题与其他用户发布的以下问题相关:
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)
我尝试的两种方法将对所有 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