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