我一直在努力寻找几小时根据其他三个向量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获取,但显然不是。