Identificar los elementos que faltan en otro conjunto de datos por grupo

AllanLC:

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>)
Ben:

Tal vez usted podría intentar lo siguiente:

  • Primera toma df1y group_by(Account.ID)y expandpara obtener todas las combinaciones de Account.IDyUser.ID

  • A continuación, left_join(df2)añadir en los productos requeridos para identificar

  • A continuación, hacer anti_join(df1)para identificar los productos que faltan

  • La final completeserá 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 

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=383991&siteId=1
Recomendado
Clasificación