Определите отсутствующие элементы из другого набора данных в группе - PullRequest
1 голос
/ 01 апреля 2020

У меня есть два набора данных, каждый из которых содержит общее поле, но хотел бы получить все отсутствующие элементы одного набора данных по сравнению с другим.

Мой df1 выглядит так:

Account.ID       Product.ID
1                A
1                B
1                C
1                D
2                A
2                E
2                F
3                B
3                D

И мой другой набор данных df2 выглядит следующим образом:

User.ID        Product.ID
X              A
X              B
X              C
Y              A
Y              U
Y              I
Z              B
Z              A

Мой идеальный вывод будет выглядеть примерно так:

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

По сути, я хотел бы получить все продукты пользователей. .ID, которые отсутствуют для каждого идентификатора Account.ID.

Вот мои образцы входных данных:

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")) 

Любая помощь будет принята с благодарностью. Большое спасибо

Реальные данные здесь:

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

Ответы [ 2 ]

1 голос
/ 01 апреля 2020

Возможно, вы могли бы попробовать следующее:

  • Сначала возьмите df1 и group_by(Account.ID) и expand, чтобы получить все комбинации Account.ID и User.ID

  • Затем left_join(df2) для добавления необходимых продуктов для идентификации

  • Далее выполните anti_join(df1), чтобы определить, какие продукты отсутствуют

  • Финальный complete обеспечит доступность строк, в которых нет пропущенных товаров. Это предполагает, что все комбинации включают X, Y, Z.

Редактировать : Чтобы обобщить на другие User.ID, вы можете заменить unique(df2$User.ID) на c("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"))

Выход

# 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 

С набором реальных данных:

df1 <- all_won_subs
df2 <- use_cases_subs
missing_products <- df1 %>%
group_by(Account.ID) %>%
 expand(Case.ID = unique(df2$Case.ID)) %>%
 left_join(df2) %>%
 anti_join(df1) %>%
 complete(Case.ID = unique(df2$Case.ID))
0 голосов
/ 01 апреля 2020

Это было бы приемлемо? Я не знаю, нужно ли вам конкретно определять переменные так, как вы это сделали. Если нет, то это может быть путь:

library(tidyverse)

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")) 

merged_df <- full_join(df1, df2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...