此问题与其他用户发布的以下问题有关:
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和日期进行分组,并在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 回答
我们可以使用
dense_rank
.