【问题标题】:Index rows by date and include duplicate dates in R按日期索引行并在 R 中包含重复的日期
【发布时间】:2020-01-23 00:27:42
【问题描述】:

我有一个数据框

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

我想创建一个新列,其中每个 ID 的所有药物都按日期编号,但开始日期相同的药物具有相同的索引。药物名称对于索引无关紧要(即,从同一日期开始的药物具有相同的索引)。例如,

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()) 进行排序,但它不处理重复日期问题。这是我第一次在这个论坛上发布问题,所以提前感谢您的帮助,如果我能澄清任何事情,请告诉我!

【问题讨论】:

  • 您可以添加您已经尝试过的内容吗?

标签: r dplyr


【解决方案1】:

您可以使用dplyr 中的dense_rank,它允许平局,并且平局之后的下一个排名值是下一个整数值。

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

【讨论】:

    【解决方案2】:

    我们可以从data.table使用frank

    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")
    

    【讨论】:

      猜你喜欢
      • 2015-09-24
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2015-12-05
      相关资源
      最近更新 更多