【问题标题】:R compare date from one column with dates in many columnsR将一列中的日期与多列中的日期进行比较
【发布时间】:2021-04-24 07:01:48
【问题描述】:

我有一个包含 8 列的数据集,8 列中有 7 列是日期列。我需要比较一列中的日期,例如 ReferenceDate 与其他列中的日期,例如 DateCol1, DateCol2, DateCol3, DateCol4, DateCol5, DateCol6, DateCol7

ID   DateCol1   DateCol2   DateCol3   DateCol4   ReferenceDate DateCol5   DateCol6   DateCol7
12  2000-11-03  2007-05-17 2003-07-11 2014-03-19 2000-07-11    1999-10-06 2015-06-29 2014-07-06 
17  2015-12-16  2017-07-26 2015-01-13 2020-01-30 2015-03-08    2007-07-30 2020-05-21 2010-10-09 
19  2003-03-06  2011-02-23 2001-09-18 2001-04-05 2013-05-17    1999-10-02 2004-08-26 2019-04-15 
23  2002-10-06  2019-03-12 1999-04-19 2008-04-03 2006-11-20    2000-11-15 2010-07-22 1999-05-27 
22  2019-05-19  2014-11-17 2001-03-24 2003-07-03 2001-04-02    2017-06-03 2016-09-21 2013-07-13

我的目标是创建一个列 Yes/No 值,指示 ReferenceDate 列中的日期是早于还是晚于其他 7 个日期列中的任何日期。

ID   DateCol1   DateCol2   DateCol3   DateCol4   ReferenceDate DateCol5   DateCol6   DateCol7    Status
12  2000-11-03  2007-05-17 2003-07-11 2014-03-19 2000-07-11    1999-10-06 2015-06-29 2014-07-06  Yes (DateCol5 earlier than Reference Date)
17  2015-12-16  2017-07-26 2015-01-13 2020-01-30 2015-03-08    2007-07-30 2020-05-21 2010-10-09  Yes (DateCol5 earlier than Reference Date)
19  2003-03-06  1981-02-23 2001-09-18 2001-04-05 2013-05-17    1999-10-02 2004-08-26 2019-04-15  Yes (DateCol2 earlier than Reference Date)
23  1992-10-06  2019-03-12 1999-04-19 2008-04-03 2006-11-20    2000-11-15 2010-07-22 1999-05-27  Yes (DateCol1 earlier than Reference Date)
22  2019-05-19  2014-11-17 2001-03-24 2003-07-03 2001-04-02    2017-06-03 2016-09-21 2013-07-13  No

我想我可以使用很多嵌套的 ifelse 来做到这一点,但我会发疯的。我需要一些帮助如何更有效地完成此任务。提前致谢。

【问题讨论】:

  • 输入的'ReferenceDate'和'expected'不一样,尤其是最后一个
  • 你的意思是nm1 <- grep('^DateCol', names(df1), value = TRUE);c("No", "Yes")[(rowSums(df1[nm1] > df1$ReferenceDate) != 0) + 1]
  • @akrun 我认为 OP 在最后一行有错字。您的解决方案肯定会奏效。
  • @akrun,你是对的。我现在解决了这个问题。此外,我更喜欢没有 grep 函数的方法,因为实际数据集中的 Date 列在其列名中没有重复模式。在本例中,为了方便起见,我使用了带有重复模式的列名。
  • @bison2178 日期列是否在一个范围内,即从第 3 列到最后一列左右

标签: r date if-statement compare


【解决方案1】:

带有rowSums 的选项将是select 'Date' 列,与'ReferenceDate' 列进行比较,检查rowSums 输出是否不等于0,将逻辑转换为数字索引(添加 1) 并使用它将值替换为“是”、“否”

nm1 <- grep('^DateCol', names(df1), value = TRUE)

或者如果列名不是'DateCol'作为模式,可能是

nm1 <- setdiff(names(df1), c("ID", "ReferenceDate"))
df1$flag <- c("No", "Yes")[(rowSums(df1[nm1] > df1$ReferenceDate) != 0) + 1]

【讨论】:

    【解决方案2】:

    也许这会有所帮助

    df$Status <- ifelse(rowSums(sapply(df[-1], `<`, df$ReferenceDate)) > 0, "Yes", "No")
    

    给出(不知道为什么期望输出的最后一行给出“否”)

    > df
      ID   DateCol1   DateCol2   DateCol3   DateCol4 ReferenceDate   DateCol5
    1 12 2000-11-03 2007-05-17 2003-07-11 2014-03-19    2000-07-11 1999-10-06
    2 17 2015-12-16 2017-07-26 2015-01-13 2020-01-30    2015-03-08 2007-07-30
    3 19 2003-03-06 2011-02-23 2001-09-18 2001-04-05    2013-05-17 1999-10-02
    4 23 2002-10-06 2019-03-12 1999-04-19 2008-04-03    2006-11-20 2000-11-15
    5 22 2003-05-19 2014-11-17 2001-03-24 2003-07-03    2014-04-02 2017-06-03
        DateCol6   DateCol7 Status
    1 2015-06-29 2014-07-06    Yes
    2 2020-05-21 2010-10-09    Yes
    3 2004-08-26 2019-04-15    Yes
    4 2010-07-22 1999-05-27    Yes
    5 2016-09-21 2013-07-13    Yes
    

    数据

    > dput(df)
    structure(list(ID = c(12L, 17L, 19L, 23L, 22L), DateCol1 = structure(c(11264,
    16785, 12117, 11966, 12191), class = "Date"), DateCol2 = structure(c(13650,
    17373, 15028, 17967, 16391), class = "Date"), DateCol3 = structure(c(12244,
    16448, 11583, 10700, 11405), class = "Date"), DateCol4 = structure(c(16148,
    18291, 11417, 13972, 12236), class = "Date"), ReferenceDate = structure(c(11149,
    16502, 15842, 13472, 16162), class = "Date"), DateCol5 = structure(c(10870,
    13724, 10866, 11276, 17320), class = "Date"), DateCol6 = structure(c(16615,
    18403, 12656, 14812, 17065), class = "Date"), DateCol7 = structure(c(16257,
    14891, 18001, 10738, 15899), class = "Date")), row.names = c(NA,
    -5L), class = "data.frame")
    

    【讨论】:

      【解决方案3】:

      使用dplyr的rowwise:

      library(dplyr)
      
      df %>%
        rowwise() %>%
        mutate(Status = if(any(c_across(starts_with('DateCol')) < ReferenceDate)) 
                        'Yes' else 'No') -> result
      
      result
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多