使用多个向量和条件逻辑来创建新向量

时间:2015-08-04 13:02:26

标签: r conditional lubridate

我一直在努力寻找几小时根据其他三个向量odate,ddate和rdate以及两个日期的内容找到创建新向量t2的方法。我不是R的专家而且它可能不漂亮,但除了我用#warning指出的两条线外,我已经完成了其中的大部分工作。我怀疑这不是正确的方法,但这是我能想到的唯一方法。我尝试使用ifelse,但它删除了我需要的日期格式。任何指针都感激不尽。

library(lubridate)

odate = ymd(c("2005-09-26",
          "2005-09-22",
          "2005-09-15",
          "2005-03-10",
          "2004-12-09",
          "2003-11-17",
          "2003-06-08",
          "2005-02-01",
          "2009-10-04",
          "2003-11-20",
          "2004-03-15"))

ddate = ymd(c("2010-08-16",
          "NA",
          "2006-12-18",
          "NA",
          "NA",
          "2004-04-22",
          "NA",
          "NA",
          "NA",
          "2010-10-07",
          "2005-07-07"))

rdate = ymd(c("2005-11-07",
          "2006-05-11",
          "NA",
          "2006-04-28",
          "2005-01-06",
          "NA",
          "NA",
          "NA",
          "NA",
          "NA",
          "NA"))

start.year = ymd("2005-01-01")

end.year = ymd("2005-12-31")

t2 = pmin(rdate, ddate, end.year)

t2[is.na(ddate) & !is.na(rdate) & rdate <= end.year] = rdate # warning

t2[is.na(ddate) & !is.na(rdate) & rdate > end.year] = end.year 

t2[is.na(rdate) & !is.na(ddate) & ddate <= end.year] = ddate # warning

t2[is.na(rdate) & !is.na(ddate) & ddate > end.year] = end.year 

t2[is.na(rdate) & is.na(ddate)]  = end.year

t2[odate > end.year | (!is.na(rdate) & rdate < start.year) | (!is.na(ddate) & ddate < start.year)] = ymd("1970-01-01")

t2

[1] "2005-11-07 UTC" "2005-12-31 UTC" "2005-12-31 UTC" "2005-12-31 UTC" "2005-11-07 UTC" "1970-01-01 UTC" "2005-12-31 UTC"
[8] "2005-12-31 UTC" "1970-01-01 UTC" "2005-12-31 UTC" NA      

t2应该是:

"2005-11-07 UTC" "2005-12-31 UTC" "2005-12-31 UTC" "2005-12-31 UTC" "2005-01-06 UTC" "1970-01-01 UTC" "2005-12-31 UTC"
"2005-12-31 UTC" "1970-01-01 UTC" "2005-12-31 UTC" "2005-07-07 UTC" 

我会尝试用文字解释。

通过将t2设置为三个日期的最小值,odate,rdate和ddate,并且由于所有三个日期向量的长度始终相同,因此t2将具有与三个日期相同的长度。

提供警告的两行是向量结构的下一部分。如果没有ddate,但是有一个rdate并且它小于结束日期,则该rdate应该是向量t2中该位置的值。类似地,如果没有rdate,但是有一个ddate并且它小于结束日期,则ddate应该是向量中位置的值。

在不同条件下使t2等于end.date的三条线都可以正常工作。

最后,如果日期超出开始日期和结束日期,则最后一行“清零”日期,必要时覆盖任何先前的值。

由“is.na(ddate)&amp;”创建的逻辑向量。 !is.na(rdate)&amp; rdate&lt; = end.year“和rdate和ddate向量一样有11个元素,所以我认为会发生的是当逻辑为真时,rdate中该索引的值将由t2获取,但显然不是。

0 个答案:

没有答案