删除R中重复不完全的行

时间:2019-06-29 21:20:08

标签: r if-statement duplicates

我有一些销售数据,这些数据会在销售点记录后被纠正,并且该数据集仍然包含初始错误的记录,然后是该错误的副本,但价格为负。但是,对于某些销售,有多个重复行是有效的,必须保留。

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

我所做的是计算COUNT,WEIGHT和TOTAL列中的每一个的abs(),然后计算重复次数。我现在正在尝试找出如何删除否定观察结果以及列复制= 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 :(得分:0)

这是另一种方法。首先,我添加一个“迭代”列,以计算发生了多少给定的事务。然后我反连接(仅保留不匹配项),但是PRICE和COUNT的符号相反。这意味着仅保留没有负匹配的原件。我们从25行增加到21行,因为两个反向条目也取消了它们原来的对应行。

看起来像第10行和第22行中的两个反向条目分别具有-1 COUNT和负价格,但是在一种情况下,这是通过负PRICE和一次通过负WEIGHT实现的。因此,将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