【问题标题】:r choosing date based on a conditonr 根据条件选择日期
【发布时间】:2017-12-15 22:41:20
【问题描述】:

我有一个包含三列的数据集,ID、代码、日期。

Id          Code                 Date
70329       CD_1020              2004-08-25
70329       DSW_46               2005-01-18
70329       AS_712               2009-09-11
1194167     CK_45                2005-10-13
1194167     CD_412               2012-04-12
1194167     DSW_99               2004-08-16
1194167     CD_456               2010-04-18

对于每个IdCode 列将包含许多不同的代码值,但它始终包含值 DSW_46DSW_99。无论每个 id 存在哪些其他代码值,这两个值(DSW_46 或 DSW_99)都会出现。

目标是根据此标准创建第四列。

第 1 步:在每个 Id 之前,捕获该行包含 DSW_46 或 DSW_99 的日期。

第二步:

a) 如果存在早于该 Id 的 DSW_46 或 DSW_99 行的行,则存储包含值 DSW_46 或 DSW_99 的日期。例如:在 Id 70329 的情况下,存在值为 DSW_46 的行,对应的日期是 2005-01-18,但是该 id 在 2005-01-18 之前有一行。所以新的日期列应该存储日期 2005-01-18

b) 如果没有比具有 DSW_46 或 DSW_99 值的行更早的行,则存储该 ID 的下一次观察的日期。例如:对于 ID 1194167,包含 DSW_99 的行的日期值为 2004-08-16,这是最早的。此 id (1194167) 在此之前没有任何内容。因此,新的日期列应存储日期 2005.10.13,即 2004-08-16 之后的下一个日期。

最终预期的数据集如下所示

Id          Code                 Date         NewDate
70329       CD_1020              2004-08-25   2005-01-18
70329       DSW_46               2005-01-18   2005-01-18 
70329       AS_712               2009-09-11   2005-01-18
1194167     CK_45                2005-10-13   2005-10-13
1194167     CD_412               2012-04-12   2005-10-13
1194167     DSW_99               2004-08-16   2005-10-13
1194167     CD_456               2010-04-18   2005-10-13

希望这是有道理的。非常感谢任何有关如何完成此操作的帮助。

【问题讨论】:

    标签: r date datatable dplyr subset


    【解决方案1】:

    另一个dplyr 解决方案,使用summariseleft_join

    dt <- read.table(text = "Id          Code                 Date
    70329       CD_1020              2004-08-25
                     70329       DSW_46               2005-01-18
                     70329       AS_712               2009-09-11
                     1194167     CK_45                2005-10-13
                     1194167     CD_412               2012-04-12
                     1194167     DSW_99               2004-08-16
                     1194167     CD_456               2010-04-18",
                     header = TRUE, stringsAsFactors = FALSE)
    
    library(dplyr)
    
    dt2 <- dt %>% 
      mutate(Date = as.Date(Date)) %>%
      group_by(Id)
    
    dt3 <- dt2 %>%
      filter(Code %in% c("DSW_46", "DSW_99")) %>%
      summarise(Date_DSW = min(Date))
    
    dt4 <- dt2 %>%  
      filter(!Code %in% c("DSW_46", "DSW_99")) %>%
      summarise(Date_min = min(Date))
    
    dt5 <- dt2 %>%
      left_join(dt3, by = "Id") %>%
      left_join(dt4, by = "Id") %>%
      mutate(NewDate = if_else(Date_DSW > Date_min, Date_DSW, Date_min)) %>%
      select(Id, Code, Date, NewDate)
    

    【讨论】:

      【解决方案2】:

      试试这个dplyrifelse

      库(dplyr)

      df$Date=as.character(df$Date)
      df1=df %>%arrange(Date)%>%group_by(Id)%>% 
          dplyr::mutate(NewDate = ifelse(sum(Date>=Date[Code%in%c('DSW_46','DSW_99')])==length(Date),Date[2] ,Date[Code%in%c('DSW_46','DSW_99')]))
      
      output
      
      
      Id    Code       Date    NewDate
          <int>   <chr>      <chr>      <chr>
      1 1194167  DSW_99 2004-08-16 2005-10-13
      2   70329 CD_1020 2004-08-25 2005-01-18
      3   70329  DSW_46 2005-01-18 2005-01-18
      4 1194167   CK_45 2005-10-13 2005-10-13
      5   70329  AS_712 2009-09-11 2005-01-18
      6 1194167  CD_456 2010-04-18 2005-10-13
      7 1194167  CD_412 2012-04-12 2005-10-13
      

      【讨论】:

      • 很高兴有帮助!~
      猜你喜欢
      • 2021-04-23
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 2019-01-15
      • 1970-01-01
      • 2021-08-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多