2017-06-06 67 views
0

我有一個數據框包含兩列:一個分組變量和分組變量持有的間隔時間段。我有另一個數據框與日期列和值列。如何使用dplyr + tidyverse函數有效地將這兩個表一起加入?如何根據與dplyr的時間間隔執行連接?

library(dplyr) 
library(lubridate) 
ty <- data_frame(date = mdy(paste(1, 1 + seq(20), 2017, sep = "/")), 
       y = c(rnorm(7), rnorm(7, mean = 2), rnorm(6, mean = -1))) 
gy <- data_frame(period = interval(mdy(c("01/01/2017", "01/08/2017", "01/15/2017")), 
            mdy(c("01/07/2017", "01/14/2017", "01/20/2017"))), 
          batch = c(1, 2, 3)) 

我想建立一個相當於表:

ty %>% mutate(batch = c(rep(1, 7), rep(2, 7), rep(3, 6))) 

理想的情況下,這應該相當快的數據集高達1,000,000行。更好的是,如果它在100,000,000的工作:)。

+3

這不回答你的問題('dplyr'),但作爲一個評論 - 你應該看看[滾動加盟在'data.table'](https://stackoverflow.com/questions/12030932/rolling-joins-data-table-in-r) – C8H10N4O2

回答

1

如何:

ty %>% 
    mutate(batch = case_when(
    ty$date %within% gy$period[1] ~gy$batch[1], 
    ty$date %within% gy$period[2] ~gy$batch[2], 
    ty$date %within% gy$period[3] ~gy$batch[3])) 

你顯然需要定義case_when間隔。你有幾個?我用過catpaste0,效果很好。

編輯以反映OP的評論。這應該照顧NSE和將允許case_when區間的產生編程:

ty %>% 
    mutate(batch = eval(parse(text = paste0("case_when(", 
             paste(
             paste0(
              "ty$date %within% gy$period[", 
              seq_along(gy$period), 
              "] ~gy$batch[", 
              seq_along(gy$period), 
              "]" 
             ), 
             collapse = ", " 
            ), ")")))) 
+0

這是一個相對少數批次的好主意。不過,我有〜10,000。對於所有的NSE,我擔心這不適用於粘貼和評估,但也許我錯了:) – wdkrnls

+1

現在應該適用於任何批次的批處理。 – biomiha

0

這是我能想出迄今最好的:

ty$batch <- unlist(lapply(ty$date, function(d) gy$batch[which(d %within% gy$period)]), recursive = FALSE, use.names = FALSE) 

但它似乎並不十分快。

相關問題