在R中加速日期查找

在R中加速日期查找,r,R,我有一个函数,它获取日期向量,并将其与日期子集列表(基于某些属性)相匹配。例如,假设我的原始数据如下所示: key_1 <- c("A", "A", "B", "B") date_1 <- as.Date(c("2012-03-31", "2011-01-31", "2011-08-07", "2014-04-09")) lookup <- date.frame(stringsAsFactors = FALSE, key_2 = c("A", "A", "A", "A",

我有一个函数,它获取日期向量,并将其与日期子集列表(基于某些属性)相匹配。例如,假设我的原始数据如下所示:

key_1 <- c("A", "A", "B", "B")
date_1 <- as.Date(c("2012-03-31", "2011-01-31", "2011-08-07", "2014-04-09"))
lookup <- date.frame(stringsAsFactors = FALSE,
  key_2 = c("A", "A", "A", "A", "B", "B", "B", "B"),
  date_2 = as.Date(c(
             "2010-05-12", "2011-05-12", "2012-05-12", "2013-05-12", 
             "2010-12-01", "2011-12-01", "2012-12-01", "2013-12-01"
           ))
)
这将产生以下结果:

date_3 <- c("2011-05-12", "2010-05-12", "2010-12-01", "2013-12-01")

date\u 3您的
date\u 3
示例真的很难理解。您将一个日期作为第一个参数传递,4个日期(它们是什么?您从未给我们一个名为
date\u 2的变量,
只传递了一列
lookup
),然后您将返回4个日期。规则是什么?
date\u 3
只是在
date\u 2
中查找
date\u 1
的每个观察结果。它使用所述观察的
键对
查找
进行子集化,然后将
date\u 1
date\u 2
子集的最大值进行匹配,该值大于
date\u 1
。是否
date\u 3[1]
应该是
2011-05-12
?是的,对此表示抱歉。
date_3 <- c("2011-05-12", "2010-05-12", "2010-12-01", "2013-12-01")
my_fun <- function(key_1, date_1) {
   indices <- sapply(unique(lookup$key_2), function(x) {which(lookup$key_2 ==  x)})
   periods <- lookup$date_2[indices[,key_1]]
   index <- findInterval(x = date_1, vec = periods) %>% as.numeric()
   periods %>% magrittr::extract(index)
}

date_3 = mapply(my_fun, key_1, date_1, USE.NAMES = FALSE) %>% 
  as.Date(origin = "1970-01-01")