Tengo dos conjuntos de datos que contiene tanto un campo común, pero me gustaría recuperar todos los elementos que faltan de un conjunto de datos en comparación con el otro.
Mis DF1 es similar al siguiente:
Account.ID Product.ID
1 A
1 B
1 C
1 D
2 A
2 E
2 F
3 B
3 D
Y mis otras miradas conjunto de datos DF2 como esto:
User.ID Product.ID
X A
X B
X C
Y A
Y U
Y I
Z B
Z A
Mi salida ideal sería algo como esto:
Account.ID User.ID Missing.Products
1 X Null
1 Y U
1 Y I
1 Z Null
2 X B
2 X C
2 Y U
2 Y I
2 Z B
3 X A
3 X C
3 Y A
3 Y U
3 Y I
3 Z A
Básicamente, me gustaría recuperar todos Product.IDs de los Usuarios que faltan para cada Account.IDs.
Aquí están mis entradas de conjuntos de datos de muestra:
df1 <- tibble(Account.ID = c(1, 1, 1, 1, 2, 2, 2, 3, 3),
Product.ID = c("A", "B", "C", "D", "A", "E", "F", "B", "D"))
df2 <- tibble(User.ID = c("X", "X", "X", "Y","Y", "Y", "Z", "Z"),
Product.ID = c("A", "B", "C", "A", "U", "I", "B", "A"))
Cualquier ayuda sería muy apreciada. Muchas gracias
Los datos real es aquí:
structure(list(Account.ID = c(1233248L, 25781287L, 14660627L,
14659269L, 9951007L, 3641831L), Product.ID = c(NA, NA, "01t60000002hNV4AAM",
"01t60000002hNV4AAM", "01t60000002hNV4AAM", "01t60000002hNV4AAM"
)), class = c("data.table", "data.frame"), row.names = c(NA,
-6L), .internal.selfref = <pointer: 0x00000000025a1ef0>)
structure(list(Case.ID = structure(c(4L, 4L, 4L, 4L, 4L, 4L), .Label =
c("Business Travel Spread Detection Platform",
"Citizens and Doctors Health Check", "Covid-19 Dashboard", "COVID19 Patient
Information Tracking",
"National Regional Operation Center - Covid-19"), class = "factor"),
Product.ID = c("8001661", "8003103", "8003145", "8004158",
"8004159", "8005365")), class = c("data.table", "data.frame"
), row.names = c(NA, -6L), .internal.selfref = <pointer: 0x00000000025a1ef0>)
Tal vez usted podría intentar lo siguiente:
Primera toma
df1
ygroup_by(Account.ID)
yexpand
para obtener todas las combinaciones deAccount.ID
yUser.ID
A continuación,
left_join(df2)
añadir en los productos requeridos para identificarA continuación, hacer
anti_join(df1)
para identificar los productos que faltanLa final
complete
será asegurarse de que tiene filas disponible donde hay productos que faltaban. Esto asume las combinaciones de todos incluyen X, Y, Z.
Editar : Para generalizar a diferente User.ID
, se puede sustituir unique(df2$User.ID)
porc("X", "Y", "Z")
library(tidyverse)
df1 %>%
group_by(Account.ID) %>%
expand(User.ID = c("X", "Y", "Z")) %>%
left_join(df2) %>%
anti_join(df1) %>%
complete(User.ID = c("X", "Y", "Z"))
Salida
# A tibble: 15 x 3
# Groups: Account.ID [3]
Account.ID User.ID Product.ID
<dbl> <chr> <chr>
1 1 X NA
2 1 Y U
3 1 Y I
4 1 Z NA
5 2 X B
6 2 X C
7 2 Y U
8 2 Y I
9 2 Z B
10 3 X A
11 3 X C
12 3 Y A
13 3 Y U
14 3 Y I
15 3 Z A