我有一个函数,它接受日期向量并将其与日期的子集列表(基于某些属性)进行匹配。例如,假设我的原始数据如下所示:
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_2
大于date_1
的最大date_1
。因此date_3
映射到date_3 = VLOOKUP(date_1[1], date_2[1:4], 1, TRUE)
。基本上,它在Excel中是这样的:
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")
我当前的功能(如下)效果很好,但我的原始数据是220k行,因此大约需要12分钟才能运行。虽然这不是世界上最糟糕的事情,但我希望有更快的方式来运行它。
table()
感谢。
更新:我已尝试同时使用这两个答案here,但无法让它们发挥作用。