РЕДАКТИРОВАТЬ : Это похоже на работу:
Иллюстративные данные :
set.seed(100)
dt1 <- data.frame(
ID = sample(1:4, 10, replace = T),
Date = paste0(sample(2018:2019, 10, replace = T),"-", sample(10:13, 10, replace = T))
)
dt1
ID Date
1 2 2019-12
2 2 2019-12
3 3 2018-12
4 1 2018-12
5 2 2019-11
6 2 2019-10
7 4 2018-13
8 2 2018-13
9 3 2018-12
10 1 2019-11
dt2 <- data.frame(
ID = sample(1:4, 5, replace = T),
Date = paste0(sample(2018:2019, 5, replace = T),"-", sample(10:13, 5, replace = T))
)
dt2
ID Date
1 2 2019-11
2 4 2018-13
3 2 2019-13
4 4 2019-13
5 3 2018-12
РЕШЕНИЕ :
Решение использует ifelse
для определения условия, при котором устанавливается «флаг» 1
(как указано в OP). Это условие подразумевает совпадение между dt1
и dt2
; таким образом мы используем match
. Осложняющим фактором является то, что условие требует совпадения double между двумя столбцами в каждом кадре данных. Поэтому мы используем apply
для вставки строк в два столбца вместе, используя paste0
и ищем совпадения в следующих составных строках:
dt1$flag <- ifelse(match(apply(dt1[,1:2], 1, paste0, collapse = " "),
apply(dt2[,1:2], 1, paste0, collapse = " ")), 1, "NA")
RESULT :
dt1
ID Date flag
1 2 2019-12 NA
2 2 2019-12 NA
3 3 2018-12 1
4 1 2018-12 NA
5 2 2019-11 1
6 2 2019-10 NA
7 4 2018-13 1
8 2 2018-13 NA
9 3 2018-12 1
10 1 2019-11 NA
Чтобы проверить результаты, мы можем сравнить их с результатами, полученными из merge
:
flagged_only <- merge(dt1, dt2)
flagged_only
ID Date
1 2 2019-11
2 3 2018-12
3 3 2018-12
4 4 2018-13
Кадр данных flagged_only
содержит в точности те же четыре строки, что и отмеченные 1
в dt1
- вуаля!