Удалить строки, которые имеют неточные дубликаты в R - PullRequest
0 голосов
/ 30 июня 2019

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

DATE    MODEL   TYPE    COUNT   PRICE   WEIGHT  TOTAL   ABS_COUNT   ABS_WEIGHT  ABS_TOTAL   replicate
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    1
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    2
20140211    JBL B   1   6.5 27  175.5   1   27  175.5   1
20140211    JBL A   1   4   11  44  1   11  44  1
20140211    JBL B   1   11.2    44  492.8   1   44  492.8   1
20140211    JBL B   1   6.5 27  175.5   1   27  175.5   2
20140211    JBL B   1   11.2    44  492.8   1   44  492.8   2
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    3
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    4
20140211    JBL B   -1  -11.2   44  -492.8  1   44  492.8   3
20140211    JBL B   1   10.9    82  893.8   1   82  893.8   1
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    5
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    6
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    7
20140211    JBL B   1   11.2    44  492.8   1   44  492.8   4
20140211    JBL A   1   3.2 15  48  1   15  48  1
20140211    JBL B   1   11.2    44  492.8   1   44  492.8   5
20140211    JBL B   1   11.2    44  492.8   1   44  492.8   6
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    8
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    9
20140211    JBL B   1   11.2    104 1164.8  1   104 1164.8  1
20140211    JBL A   -1  4.5 -15 -67.5   1   15  67.5    10
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    11
20140211    JBL A   1   4.5 15  67.5    1   15  67.5    12
20140211    JBL B   1   11.2    44  492.8   1   44  492.8   7

Я рассчитал abs () для каждого из столбцов COUNT, WEIGHT и TOTAL, а затем подсчиталколичество копийЯ сейчас пытаюсь выяснить, как удалить отрицательные наблюдения, а также соответствующий дубликат, где столбец replicate = n-1

test$ABS_COUNT <- abs(test$COUNT)
test$ABS_WEIGHT <- abs(test$WEIGHT)
test$ABS_TOTAL <- abs(test$TOTAL)`

test2 <- test %>%
  dplyr::group_by(DATE, MODEL, TYPE, PRICE, ABS_COUNT, ABS_WEIGHT, ABS_TOTAL) %>%
  dplyr::mutate(replicate=seq(n()))%>%
  ungroup()

1 Ответ

0 голосов
/ 30 июня 2019

Вот другой подход. Сначала я добавляю столбец «Итерация», чтобы подсчитать, сколько из данной транзакции произошло. Затем я против присоединения (сохраняя только несоответствия) с самим собой, но там, где ЦЕНА и СЧЕТ изменили знак. Это означает, что хранятся только оригиналы, у которых нет отрицательного соответствия. Мы переходим от 25 строк к 21, поскольку две записи обратного хода также отменяют свои исходные аналоги.

Похоже, что две записи обратного хода в строках 10 и 22 имеют -1 СЧЕТ и отрицательную цену, но в одном случае это было достигнуто, хотя отрицательная ЦЕНА и один раз через отрицательный ВЕС. Таким образом, кажется, что использование COUNT и TOTAL для анти-объединения будет более надежным, чем включение PRICE и WEIGHT, которые не меняются местами в обратной записи.

library(dplyr)
temp <- df %>%
  select(DATE:TOTAL) %>%  # Just the original data
  group_by(DATE, MODEL, TYPE, COUNT, TOTAL) %>%
  mutate(iteration = row_number()) %>%
  ungroup()

df2 <- temp %>% 
  anti_join(temp %>% 
               filter(TOTAL < 0) %>% 
               mutate(COUNT = -COUNT, TOTAL = -TOTAL) %>% 
              select(DATE:COUNT, TOTAL, iteration))

> df2
# A tibble: 21 x 8
       DATE MODEL TYPE  COUNT PRICE WEIGHT TOTAL iteration
      <int> <chr> <chr> <int> <dbl>  <int> <dbl>     <int>
 1 20140211 JBL   A         1   4.5     15  67.5         2
 2 20140211 JBL   B         1   6.5     27 176.          1
 3 20140211 JBL   A         1   4       11  44           1
 4 20140211 JBL   B         1   6.5     27 176.          2
 5 20140211 JBL   B         1  11.2     44 493.          2
 6 20140211 JBL   A         1   4.5     15  67.5         3
 7 20140211 JBL   A         1   4.5     15  67.5         4
 8 20140211 JBL   B         1  10.9     82 894.          1
 9 20140211 JBL   A         1   4.5     15  67.5         5
10 20140211 JBL   A         1   4.5     15  67.5         6
# … with 11 more rows
...