比较两个日期向量与R中的函数,以避免循环和处理NA

时间:2013-01-30 00:43:07

标签: r date vector

这可能有一个非常简单的解决方法,但是这里...我试图比较R中的两个日期向量(最初不作为日期向量输入):如果第二个是NA,则返回第一个值首先不缺;如果第二个日期没有丢失,则返回两个日期中最大的日期;或者如果两个值都缺失则返回NA。例如,对于下面显示的数据,我希望lastdate计算如下:

v1        v2         lastdate
1/2/2006  NA         1/2/2006
1/2/2006  12/2/2006  12/2/2006
NA        NA         NA

我编写了一个公式来避免在每一行(这些数据中为85K)上循环,如下所示:

lastdate <- function(lastdate1,lastdate2){
    if (is.na(lastdate1)==T & is.na(lastdate2)==T) {NA}
    else if (is.na(lastdate2)==T & !is.na(lastdate1)) {as.Date(lastdate1,format="%m/%d/%Y")}
    else {max(as.Date(lastdate2,format="%m/%d/%Y"),as.Date(lastdate1,format="%m/%d/%Y"))}
}
dfbobs$leaveobsdate <- lastdate(as.Date(dfbobs$leavedate1,format="%m/%d/%Y"),as.Date(dfbobs$leavedate2,format="%m/%d/%Y"))

最后一行是告诉它比较两个日期向量,但是因为我得到错误而不太正确

Warning messages:
1: In if (is.na(lastdate1) == T & is.na(lastdate2) == T) { :
  the condition has length > 1 and only the first element will be used
2: In if (is.na(lastdate2) == T & !is.na(lastdate1)) { :
  the condition has length > 1 and only the first element will be used

我确信这是非常愚蠢的,并且可能有更简单的方法来做到这一点,但任何帮助都会受到赞赏。

编辑:我现在尝试使用ifelse函数处理向量,如建议的那样,但比较,如果我输入单个值(例如,lastdate(“1/1/2006”,“1) / 2/2006“)),如果我在数据帧向量上尝试,则产生NA。代码如下:

lastdate <- function(lastdate1,lastdate2){
ifelse(is.na(lastdate1==T) & is.na(lastdate2==T), NA, 
    ifelse(is.na(lastdate2)==T & !is.na(lastdate1), as.Date(lastdate1,format="%m/%d/%Y"), 
        ifelse(!is.na(lastdate2) & !is.na(lastdate1), max(as.Date(lastdate2,format="%m/%d/%Y"),as.Date(lastdate1,format="%m/%d/%Y")),NA)))
}
dfbobs$leaveobsdate <- as.Date(lastdate(as.Date(dfbobs$leavedate1,format="%m/%d/%Y"),as.Date(dfbobs$leavedate2,format="%m/%d/%Y")),origin="1970-01-01")

2 个答案:

答案 0 :(得分:1)

if没有矢量化 - 它需要一个参数。使用ifelse

或者,您可以将mapply与现有功能一起使用:

mapply(lastdate, as.Date(df$leavedate1, ...), as.Date(df$v2, ...))

答案 1 :(得分:1)

试试这个:

将日期转换为数字形式,如此

v1<-as.character(v1); v2<-as.character(v2);
v1<-as.numeric(strftime(strptime(v1,"%m/%d/%Y"),"%Y%m%d"));
v2<-as.numeric(strftime(strptime(v2,"%m/%d/%Y"),"%Y%m%d"));

现在计算结果

result<-ifelse(!is.na(v1) | !is.na(v2),max(v1,v2,na.rm=TRUE),NA);

退回到您选择的格式

result<-strptime(result,"%Y%m%d");
result<-strftime(result,"%m/%d/%Y");