Индексировать строки по дате и включать повторяющиеся даты в R - PullRequest
0 голосов
/ 22 января 2020

У меня есть фрейм данных

ID       drug start date 
A           X 2019-11-16
A           Y 2018-11-16
A           Z 2020-11-16
B           X 2019-11-16
B           Y 2019-11-16
B           X 2020-11-16
C           X 2019-11-16
C           X 2020-11-16

Я хочу создать новый столбец, в котором все препараты для каждого идентификатора пронумерованы по дате, но те, которые имеют одинаковую дату начала, имеют одинаковый индекс. Название препарата не имеет значения для индексации (ie, те, которые начинаются в ту же дату, имеют одинаковый индекс). Например,

ID       drug start date order
A           X 2019-11-16     2
A           Y 2018-11-16     1
A           Z 2020-11-16     3
B           X 2019-11-16     1
B           Y 2019-11-16     1
B           X 2020-11-16     2
C           X 2019-11-16     1
C           X 2020-11-16     2

Как мне создать этот новый столбец? Затем я попытался отсортировать, используя mutate(order=row_number()), но это не касается проблемы с повторяющимися датами. Я впервые публикую вопрос на этом форуме, поэтому заранее благодарю за помощь и, пожалуйста, дайте мне знать, если я смогу что-то уточнить!

Ответы [ 2 ]

1 голос
/ 22 января 2020

Вы можете использовать dense_rank из dplyr, который учитывает связи и следующее значение ранга после того, как t ie является следующим целочисленным значением.

library(dplyr)

df %>%  
    group_by(ID) %>%
    mutate(order = dense_rank(`start date`))
#> # A tibble: 8 x 4
#> # Groups:   ID [3]
#>   ID    drug  `start date` order
#>   <chr> <chr> <date>       <int>
#> 1 A     X     2019-11-16       2
#> 2 A     Y     2018-11-16       1
#> 3 A     Z     2020-11-16       3
#> 4 B     X     2019-11-16       1
#> 5 B     Y     2019-11-16       1
#> 6 B     X     2020-11-16       2
#> 7 C     X     2019-11-16       1
#> 8 C     X     2020-11-16       2
0 голосов
/ 22 января 2020

Мы можем использовать frank из data.table

library(data.table)
setDT(df1)[, order := frank(start_date, ties.method = 'dense'), ID]
df1
#   ID drug start_date order
#1:  A    X 2019-11-16     2
#2:  A    Y 2018-11-16     1
#3:  A    Z 2020-11-16     3
#4:  B    X 2019-11-16     1
#5:  B    Y 2019-11-16     1
#6:  B    X 2020-11-16     2
#7:  C    X 2019-11-16     1
#8:  C    X 2020-11-16     2

данные

df1 <- structure(list(ID = c("A", "A", "A", "B", "B", "B", "C", "C"), 
    drug = c("X", "Y", "Z", "X", "Y", "X", "X", "X"), 
     start_date = structure(c(18216, 
    17851, 18582, 18216, 18216, 18582, 18216, 18582), class = "Date")), 
   row.names = c(NA, 
-8L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...