目前正在尝试编写一些从小于日期 X 的有序列表中返回最后一个日期的内容。
现在我有这个:它获取日期列表,并获取我们将要进行搜索的那一天的索引以及我们想要返回多少日期的范围。
之后,它会检查日期是否存在(例如 2 月 30 日)。如果日期不存在,它将日期减 1,然后再次应用过滤器(否则它会尝试从中减去 1 天NA
并失败)。
library(lubridate)
getDate <- function(dates,day,range){
if(range == 'single')
{return (day-1)}
z <- switch(range,
single = days(1),
month = days(30),
month3 = months(3),
month6 = months(6),
year = years(1)
)
new_day <-(dates[day]-z)
i <- 1
while (is.na(new_day)){
new_day <- dates[day] - days(i) - z
}
ind<-which.min(abs (diff <-(new_day-dates)))
if (diff[ind] < 0)
{ind <- ind -1}
return (ind[1])
}
虽然此功能有效,但问题在于速度效率。我有一种which.min(abs())
远非最快的感觉,我想知道是否有更好的选择(除了编写我自己的搜索列表函数之外)。
stocks <- list(structure(list(sec = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), min = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), hour = c(0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L), mday = c(2L, 3L, 4L, 7L, 8L, 9L, 10L, 11L, 14L, 15L, 16L, 17L,
18L, 22L, 23L, 24L, 25L, 28L, 29L, 30L, 31L, 1L, 4L, 5L, 6L), mon = c(0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 1L,
1L, 1L, 1L), year = c(108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L,
108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L, 108L,
108L, 108L, 108L), wday = c(3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,
2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L), yday = c(1L, 2L, 3L, 6L, 7L,
8L, 9L, 10L, 13L, 14L, 15L, 16L, 17L, 21L, 22L, 23L, 24L, 27L, 28L, 29L, 30L,
31L, 34L, 35L, 36L), isdst = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L,
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("sec", "min",
"hour", "mday", "mon", "year", "wday", "yday", "isdst"), tzone = "UTC",
class = c("POSIXlt", "POSIXt")))
old_pos <- getDate(stocks[[1]],21,"month") #should return 0
old_pos <- getDate(stocks[[1]],22,"month") #should return 1
这不会返回向量,也不会返回日期,仅返回索引,主要问题不是关于工作(它确实如此),而是优化它。
该值稍后会在另一个函数中使用,一个可能的加速方法是首先将所有旧索引与新索引匹配,然后将其作为另一个列表返回。但是不确定它是否会提供任何加速。