Пакет data.table
допускает переходящие объединения :
library(data.table)
setDT(DF2)[setDT(DF1), on = .(Manual.Code, Release_week = Week), roll = +Inf]
Manual.Code Version Release_week Machines
1: M123 1.1 201651 A
2: M467 1.6 201635 A
3: M123 2.0 201714 B
4: M846 NA 201516 C
5: M898 NA 201438 D
6: QQQQ NA 201704 A
7: M898 2.4 201651 B
Обратите внимание, что только целые, двойные или символьные столбцы могут быть свернутыприсоединился.Поэтому при вызове data.frame()
. Обязательно используйте параметр stringsAsFactors = FALSE
.
Результат может быть точно настроен для соответствия ожидаемому результату OP:
library(data.table)
result <- setDT(DF2)[setDT(DF1), on = .(Manual.Code, Release_week = Week), roll = +Inf]
setnames(result, c("Release_week", "Version"), c("Week", "Used.Version"))
setcolorder(result, names(DF1))
result
Machines Week Manual.Code Used.Version
1: A 201651 M123 1.1
2: A 201635 M467 1.6
3: B 201714 M123 2.0
4: C 201516 M846 NA
5: D 201438 M898 NA
6: A 201704 QQQQ NA
7: B 201651 M898 2.4
Данные
Обратите внимание, что используются данные, предоставленные OP, но с stringsAsFactors = FALSE
.
Machines = c('A', 'A', 'B', 'C', 'D', 'A', 'B')
Week = c('201651', '201635', '201714', '201516', '201438', '201704', '201651')
Manual.Code = c('M123', 'M467', 'M123', 'M846', 'M898', 'QQQQ' ,'M898')
DF1 = data.frame(Machines, Week, Manual.Code, stringsAsFactors = FALSE)
Manual.Code = c('M123', 'M123', 'M123', 'CTTY', 'M467', 'M.99', 'M846', 'M898')
Version = as.numeric(c('2.0', '1.1', '1.0', '2.0', '1.6', '1.67', '3.2', '2.4'))
Release_week = (c('201711', '201638', '201612', '201424', '201552', '201345',
'201719', '201647'))
DF2 = data.frame(Manual.Code, Version, Release_week, stringsAsFactors = FALSE)