Я предлагаю использовать удивительный пакет data.table, потому что для многих задач он быстрее, чем dplyr.
Я немного изменил пример, чтобы было пересечение с длиной> 1.
library(data.table)
A <- data.table("session_id" = c(1105, 1105, 1107 ,1107 ,1108, 1108, 1120),
"request" = c(8,3,14,15,9,10, 20))
B <- data.table("session_id" = c(1105, 1107, 1107, 1108, 1109, 1110, 1111),
"request" = c(3, 15, 14, 9, 6, 5, 9))
Сначала мы выполняем внешнее левое соединение, чтобы получить все значения запроса из таблицы B:
C <- merge(A,B, all.x = T, by = "session_id")
Затем мы просто вычисляем длину пересечения с помощью удобной операции «by»и присоедините результат обратно к A:
C[, len_inter := length(intersect(request.x, request.y)), by=session_id]
A[C, len_inter := i.len_inter, on="session_id"]
> A
session_id request len_inter
1: 1105 8 1
2: 1105 3 1
3: 1107 14 2
4: 1107 15 2
5: 1108 9 1
6: 1108 10 1
7: 1120 20 0
PS: В будущем, пожалуйста, добавьте некоторый код для создания вашего примера data.frames, чтобы людям не приходилось вручную печатать ваши таблицы.