Вы можете сделать это с помощью некоторого аккуратного кода.
Во-первых, некоторые данные без точек (я решил, что точки не нужны, исправьте меня, если я ошибаюсь):
x1 <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
User Product
A 1
A 2
A 3
B 1
B 3
B 4')
x2 <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
Group Product
X1 1
X1 2
X1 4
X2 1
X2 3')
out <- read.table(header=TRUE, stringsAsFactors=FALSE, text='
User X1 X2
A 1 0
B 0 1')
Необходимые пакеты:
library(dplyr)
library(tidyr)
library(purrr)
x1n <- group_by(x1, User) %>% nest(.key = "x1prod")
x2n <- group_by(x2, Group) %>% nest(.key = "x2prod")
crossing(User = x1n$User, Group = x2n$Group) %>%
left_join(x1n, by = "User") %>%
left_join(x2n, by = "Group") %>%
mutate(allx = map2_lgl(x1prod, x2prod, ~ all(.y$Product %in% .x$Product)))
# # A tibble: 4 x 5
# User Group x1prod x2prod allx
# <chr> <chr> <list> <list> <lgl>
# 1 A X1 <tibble [3 x 1]> <tibble [3 x 1]> FALSE
# 2 A X2 <tibble [3 x 1]> <tibble [2 x 1]> TRUE
# 3 B X1 <tibble [3 x 1]> <tibble [3 x 1]> FALSE
# 4 B X2 <tibble [3 x 1]> <tibble [2 x 1]> TRUE
Это, конечно, не ваш желаемый результат, но я показываю этот вывод, чтобы продемонстрировать, что делает вложение и что мы сравниваем по строкам x1prod
(один столбецProduct
) и x2prod
(то же самое).Отсюда достаточно простого удаления столбцов и расширения:
crossing(User = x1n$User, Group = x2n$Group) %>%
left_join(x1n, by = "User") %>%
left_join(x2n, by = "Group") %>%
mutate(allx = map2_lgl(x1prod, x2prod, ~ all(.y$Product %in% .x$Product))) %>%
select(-x1prod, -x2prod) %>%
spread(Group, allx)
# # A tibble: 2 x 3
# User X1 X2
# <chr> <lgl> <lgl>
# 1 A FALSE TRUE
# 2 B FALSE TRUE
(я также предполагаю, что желаемый результат немного ошибочен, так как A
не имеет «4» из группы X1
.)