gpt4 book ai didi

r - Vectorise 查找最近的日期函数

转载 作者:行者123 更新时间:2023-12-03 22:58:48 26 4
gpt4 key购买 nike

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

以下函数执行我对单个日期的要求,但是我无法弄清楚如何将其推广到 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

有人可以帮忙吗?

最佳答案

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 ]

要向下舍入而不是向上舍入,请删除 +1 .如果您真的想找到最接近的日期,而不是之前或之后的日期,您可以创建一个新的日期列表,这些日期是间隔的中点( as.Date(rowMeans(embed(as.numeric(oddDates),2)), '1960-01-01') )并使用 findInterval在那些上。查看 findInterval 的参数对于其他选项。

关于r - Vectorise 查找最近的日期函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13946614/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com