我想传递一个日期向量,并从第二个(部分匹配)日期向量返回最接近的日期.
以下函数执行我对单个日期所需的功能,但是我无法弄清楚如何将其概括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)
有人可以帮忙吗?
该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其他选项的参数.
现在,通过该示例,只需处理小于一种情况或大于另一种情况的日期子集,即当时正在检查的特定目标。
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)