Vectorise找到最近的日期函数

ric*_*rdo 5 r date

我想传递一个日期向量,并从第二个(部分匹配)日期向量返回最接近的日期.

以下函数执行我对单个日期所需的功能,但是我无法弄清楚如何将其概括searchDate为日期向量的情况.

closestDate <- function(searchDate, dateList, roundDown=FALSE){
  if (roundDown) {
    dist2date <- as.Date(dateList) - as.Date(searchDate)
    closest <- which(max(dist2date[dist2date<=0]) == dist2date)
  } else {
    dist2date <- as.Date(dateList) - as.Date(searchDate)
    closest <- which(min(dist2date[dist2date>=0]) == dist2date)
  }
  return(dateList[closest])
}

dateSeq <- seq(as.Date("2011-01-01"), as.Date("2012-12-19"), by='day')
oddDates <- dateSeq[as.logical(1:length(dateSeq) %%2)]

closestDate('2012-12-14', oddDates)
[1] "2012-12-15"

miscDatesLong <- rep(c('2012-12-14', '2012-12-16', '2012-12-18'), 100 )
closestDate(miscDatesLong, oddDates)

closestDate(miscDatesLong, oddDates)
[1] "2012-12-15" "2012-12-17" "2012-12-19"
Warning message:
In unclass(time1) - unclass(time2) :
  longer object length is not a multiple of shorter object length
Run Code Online (Sandbox Code Playgroud)

有人可以帮忙吗?

Gre*_*now 5

findInterval功能可以快速完成:

dateSeq <- seq(as.Date("2011-01-01"), as.Date("2012-12-19"), by='day')
oddDates <- dateSeq[as.logical(1:length(dateSeq) %%2)]

oddDates[ findInterval(as.Date('2012-12-14'), oddDates)+1 ]

miscDatesLong <- rep(c('2012-12-14', '2012-12-16', '2012-12-18'), 100)

oddDates[ findInterval(as.Date(miscDatesLong), oddDates) + 1 ]
Run Code Online (Sandbox Code Playgroud)

向下舍入而不是向上删除+1.如果你真的想找到最接近的日期,而不是在你之前或之后创建一个新的日期列表,这些日期是interval(as.Date(rowMeans(embed(as.numeric(oddDates),2)), '1960-01-01'))的中点并使用findInterval它们.请参阅findInterval其他选项的参数.


42-*_*42- 3

现在,通过该示例,只需处理小于一种情况或大于另一种情况的日期子集,即当时正在检查的特定目标。

closestDt <- function(searchDate, dateList, roundDown=FALSE) 
     as.Date( sapply( searchDate , function (x) if( roundDown ){ 
                max( dateList[ dateList <= x ] ) } else {
                min( dateList[ dateList >= x])  } 
           ), "1970-01-01")
Run Code Online (Sandbox Code Playgroud)