Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R将一列中的日期与多列中的日期进行比较_R_Date_If Statement_Compare - Fatal编程技术网

R将一列中的日期与多列中的日期进行比较

R将一列中的日期与多列中的日期进行比较,r,date,if-statement,compare,R,Date,If Statement,Compare,我的数据集有8列,8列中有7列是日期列。我需要比较一列(比如ReferenceDate)中的日期与其他列(比如DateCol1、DateCol2、DateCol3、DateCol4、DateCol5、DateCol6、DateCol7)中的日期 我的目标是创建一个列Yes/No值,该值指示ReferenceDate列中的日期是否早于或晚于其他7个日期列中的任何日期 ID DateCol1 DateCol2 DateCol3 DateCol4 ReferenceDate Dat

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

我的目标是创建一个列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来做这件事,但我会发疯的。我需要一些帮助如何更有效地完成这项工作。提前谢谢。

也许这会有所帮助

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


也许这会有帮助

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

行和的一个选项是选择“日期”列,与“ReferenceDate”列进行比较,检查行和输出是否不等于0,将逻辑索引转换为数字索引add 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]
行和的一个选项是选择“日期”列,与“ReferenceDate”列进行比较,检查行和输出是否不等于0,将逻辑索引转换为数字索引add 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]
使用dplyr的行方式:

使用dplyr的行方式:


“ReferenceDate”是输入的,“expected”与上一个不相同,您是指nm1 df1$ReferenceDate!=0+1]@akrun我想OP在最后一行有一个输入错误。您的解决方案肯定有效。@akrun,您是对的。我现在修好了。另外,我更喜欢不使用grep函数的方法,因为实际数据集中的日期列的列名中没有重复模式。在本例中,为了方便起见,我使用了一个带有重复模式的列名。@bison2178是范围内的日期列,即从第3列到最后一列,或因此输入的“ReferenceDate”与“expected”不相同,特别是最后一列。您是指nm1 df1$ReferenceDate!=0+1]@akrun我想OP在最后一行有一个输入错误。您的解决方案肯定有效。@akrun,您是对的。我现在修好了。另外,我更喜欢不使用grep函数的方法,因为实际数据集中的日期列的列名中没有重复模式。为了方便起见,我在本例中使用了带重复模式的列名。@bison2178是范围内的日期列,即从第3列到最后一列左右
library(dplyr)

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

result