R: Как удалить дубликаты с некоторыми условиями в сложном Dataframe? - PullRequest
2 голосов
/ 17 октября 2019

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

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

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

Bld.No <- c(1,1,1,1,1,1,2,2,2,2)
Section <- c("A","A","A","A","B","B","C","C","D","D")
Room.No <- c(100,100,100,100,200,200,300,300,400,400)
Gold <- c(8,6,4,0,6,0,7,2,2,1)
Silver <- c(1,0,0,1,2,3,4,0,4,0)
Total <- c(9,6,4,1,8,3,11,2,6,1)
Emp.Gold.ID <- c("A11, A09, B22, E12, A04, C09, D33, A01", "A11, A09, B22, E12, A04, A01", "A09, 822, E12, A04", NA, "A71, A09, B12, E32, A04, C19", NA, "B22, E12, A04, C09, D33, A01, M11", "E12, Z09", "C09, D33", "D18")
Emp.Silver.ID <- c("A17", NA, NA, "D33", "B22, E12", "A09, B12, E32", "A44, C02, D03, A71", NA, "A12, A01, M11, D18", NA)

df <- data.frame(Bld.No, Section, Room.No, Gold, Silver, Total, Emp.Gold.ID, Emp.Silver.ID)

Примечание: если emp.Id уже есть в предыдущих записях, будь то золото или серебро, мы должны удалить его. Значение ID должно быть в любом из них и удалить дубликаты. Посмотрите пример последней записи в таблице сэмплов и выходных данных, мы удалили последнюю запись (2, D, 400, 1, 0, 1, D18, NA), потому что D18 уже находится в предыдущей записи, даже если онав серебряной колонне.

Данные выборки и выходные данные:

Данные выборки и выходные данные

1 Ответ

0 голосов
/ 18 октября 2019

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

После удаления дубликатов идентификаторов будут созданы разделенные запятыми строки идентификаторов. для золота и серебра. Вы можете суммировать общее количество золота и серебра до или после этого шага.

Обратите внимание, что для получения тех же результатов, что и в примере данных и вывода, я изменил 822 на B22.

Пожалуйста, дайте мне знать, если вы это имели в виду.

library(dplyr)
library(tidyr)

df$Emp.Gold.ID <- as.character(df$Emp.Gold.ID)
df$Emp.Silver.ID <- as.character(df$Emp.Silver.ID)

df %>% 
  separate_rows(Emp.Gold.ID) %>%
  separate_rows(Emp.Silver.ID) %>%
  pivot_longer(cols = starts_with("Emp."), names_to = "ID", values_drop_na = TRUE) %>%
  group_by(Bld.No, Section, Room.No) %>%
  distinct(value, .keep_all = TRUE) %>%
  group_by(Bld.No, Section, Room.No, ID) %>%
  summarise(NewID = toString(value)) %>%
  pivot_wider(names_from = ID, values_from = NewID) %>%
  mutate(Gold = length(unlist(strsplit(Emp.Gold.ID, ", "))),
         Silver = length(unlist(strsplit(Emp.Silver.ID, ", "))),
         Total = Gold + Silver)

# A tibble: 4 x 8
# Groups:   Bld.No, Section, Room.No [8]
  Bld.No Section Room.No Emp.Gold.ID                            Emp.Silver.ID       Gold Silver Total
   <dbl> <fct>     <dbl> <chr>                                  <chr>              <int>  <int> <int>
1      1 A           100 A11, A09, B22, E12, A04, C09, D33, A01 A17                    8      1     9
2      1 B           200 A71, A09, B12, E32, A04, C19           B22, E12               6      2     8
3      2 C           300 B22, E12, A04, C09, D33, A01, M11, Z09 A44, C02, D03, A71     8      4    12
4      2 D           400 C09, D33                               A12, A01, M11, D18     2      4     6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...