加速R

时间:2018-04-04 14:27:55

标签: 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", "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,但无法让它们发挥作用。

0 个答案:

没有答案