在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")