Попробуйте:
mD = data.table(monthlyData, key="ID,Month")
qD = data.table(qtrData,key="ID,startMonth")
qD[mD,roll=TRUE]
ID startMonth endMonth QTRValue MonValue
[1,] A 1 3 1 1
[2,] A 2 3 1 2
[3,] A 3 3 1 3
[4,] A 4 5 2 4
[5,] A 5 5 2 5
[6,] B 1 2 3 6
[7,] B 2 2 3 7
[8,] B 3 5 4 8
[9,] B 4 5 4 9
[10,] B 5 5 4 10
Это должно быть намного быстрее.
РЕДАКТИРОВАТЬ: Ответ на вопрос о последующем редактировании.Одним из способов является использование NA для хранения там, где пропущены месяцы.Мне легче смотреть на один столбец временного ряда (нерегулярный с пробелами и NA), чем на два, составляющих ряд диапазонов.
> mD <- data.table(ID = rep(c("A", "B"), each = 10),
+ Month = rep(1:10, times = 2),
+ MonValue = 1:20, key="ID,Month")
>
> qD <- data.table(ID = rep(c("A", "B"), each = 4),
+ Month = c(1,4,6,7, 1,3,6,8),
+ QtrValue = c(1,2,NA,3, 4,5,NA,6),
+ key="ID,Month")
>
> mD
ID Month MonValue
[1,] A 1 1
[2,] A 2 2
[3,] A 3 3
[4,] A 4 4
[5,] A 5 5
[6,] A 6 6
[7,] A 7 7
[8,] A 8 8
[9,] A 9 9
[10,] A 10 10
[11,] B 1 11
[12,] B 2 12
[13,] B 3 13
[14,] B 4 14
[15,] B 5 15
[16,] B 6 16
[17,] B 7 17
[18,] B 8 18
[19,] B 9 19
[20,] B 10 20
> qD
ID Month QtrValue
[1,] A 1 1
[2,] A 4 2
[3,] A 6 NA # missing for 1 month (6)
[4,] A 7 3
[5,] B 1 4
[6,] B 3 5
[7,] B 6 NA # missing for 2 months (6 and 7)
[8,] B 8 6
> qD[mD,roll=TRUE]
ID Month QtrValue MonValue
[1,] A 1 1 1
[2,] A 2 1 2
[3,] A 3 1 3
[4,] A 4 2 4
[5,] A 5 2 5
[6,] A 6 NA 6
[7,] A 7 3 7
[8,] A 8 3 8
[9,] A 9 3 9
[10,] A 10 3 10
[11,] B 1 4 11
[12,] B 2 4 12
[13,] B 3 5 13
[14,] B 4 5 14
[15,] B 5 5 15
[16,] B 6 NA 16
[17,] B 7 NA 17
[18,] B 8 6 18
[19,] B 9 6 19
[20,] B 10 6 20
> qD[mD,roll=TRUE][!is.na(QtrValue)]
ID Month QtrValue MonValue
[1,] A 1 1 1
[2,] A 2 1 2
[3,] A 3 1 3
[4,] A 4 2 4
[5,] A 5 2 5
[6,] A 7 3 7
[7,] A 8 3 8
[8,] A 9 3 9
[9,] A 10 3 10
[10,] B 1 4 11
[11,] B 2 4 12
[12,] B 3 5 13
[13,] B 4 5 14
[14,] B 5 5 15
[15,] B 8 6 18
[16,] B 9 6 19
[17,] B 10 6 20