【问题标题】:How to get visit number for multiple different study IDs using sample dates如何使用示例日期获取多个不同研究 ID 的访问号
【发布时间】:2018-03-21 05:22:12
【问题描述】:
Study.ID    Visit Number    Sample.Date
2497                        24/05/2013
2497                        01/11/2017
2497                        15/07/2010
1805                        27/01/2015
1805                        14/04/2014
1805                        30/08/2017
1805                        21/09/2009

假设我在数据框中填充了这两个变量。我需要输入与 Sample.Date 对应的访问编号(即每个 Study.ID 的最早日期分别为 1 号和最近的日期分别为 2、3 或 4 号。我非常感谢任何人对此的输入。整个数据框包含 400 多个不同的 study.ID,具有不同的多次访问。我真的不想更改排列顺序,因为样本需要按照扫描顺序加载到数据库中。

【问题讨论】:

    标签: r sorting date


    【解决方案1】:

    1) Base RSample.Date 转换为"Date" 类,然后使用averankStudy.ID 分组以获得排名顺序。原订单不变,不使用包。

    DF <- transform(DF, Sample.Date = as.Date(Sample.Date, "%d/%m/%Y"))
    transform(DF, Visit.No = ave(as.numeric(Sample.Date), Study.ID, FUN = rank))
    

    给予:

      Study.ID Sample.Date Visit.No
    1     2497  2013-05-24        2
    2     2497  2017-11-01        3
    3     2497  2010-07-15        1
    4     1805  2015-01-27        3
    5     1805  2014-04-14        2
    6     1805  2017-08-30        4
    7     1805  2009-09-21        1
    

    1a) magrittr 这可以使用如下的 magrittr 管道表示:

    library(magrittr)
    
    DF %>%
       transform(Sample.Date = as.Date(Sample.Date, "%d/%m/%Y")) %>%
       transform(Visit.No = ave(as.numeric(Sample.Date), Study.ID, FUN = rank))
    

    2) dplyr 使用 dplyr 管道变成:

    library(dplyr)
    
    DF %>%
       mutate(Sample.Date = as.Date(Sample.Date, "%d/%m/%Y")) %>%
       group_by(Study.ID) %>%
       mutate(Visit.No = rank(Sample.Date)) %>%
       ungroup()
    

    注意:假设可重现形式的输入为:

    Lines <- "
    Study.ID                   Sample.Date
    2497                        24/05/2013
    2497                        01/11/2017
    2497                        15/07/2010
    1805                        27/01/2015
    1805                        14/04/2014
    1805                        30/08/2017
    1805                        21/09/2009"
    
    DF <- read.table(text = Lines, header = TRUE)
    

    【讨论】:

      【解决方案2】:

      使用tidyverse 包和示例数据

      library(tidyverse)
      dd<-read_table("Study.ID  Sample.Date
      2497      24/05/2013
      2497      01/11/2017
      2497      15/07/2010
      1805      27/01/2015
      1805      14/04/2014
      1805      30/08/2017
      1805      21/09/2009")
      

      如果您对 Sample.Date 没有任何“联系”,您可以这样做

      dd %>% 
        mutate(Sample.Date=parse_date(Sample.Date, "%d/%m/%Y")) %>%
        group_by(Study.ID) %>%
        mutate(Visit.Number=dense_rank(Sample.Date))
      

      否则可能是这样的

      dd %>% 
        mutate(Sample.Date=parse_date(Sample.Date, "%d/%m/%Y")) %>%
        group_by(Study.ID) %>%
        arrange(Sample.Date) %>%
        mutate(Visit.Nuumber=row_number())
      

      会有帮助的。

      【讨论】:

        【解决方案3】:

        转换日期后,您可以简单地将rank() 函数与desc() 结合使用。

        df <- data.frame(Study.ID = c(2497, 2497, 2497, 1805, 1805, 1805, 1805),
                         Sample.Date = c("24/05/2013", "01/11/2017", "15/07/2010",
                                         "27/01/2015", "14/04/2014", "30/08/2017",
                                         "21/09/2009")) # data
        df$Sample.Date <- as.Date(df$Sample.Date, format="%d/%m/%Y") # conversion
        library(plyr)
        df$Visit.Number <- rank(desc(df$Sample.Date)) # date ranking
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2021-11-22
          • 1970-01-01
          • 1970-01-01
          • 2020-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多