Когда-либо возникающая проблема - ранее задавался вопрос: R: Есть ли способ поиска почти идентичной строки?
По сути, мне нужно сделать возмещение (с отрицательным количеством ) отменить соответствующую покупку (и).
Данные
df <- read.table(h=T,text="
id1 id2 id3 datee price quant
1 B Y '2018-12-19' 4 -3000
1 A Y '2018-12-04' 4 3000
1 B Y '2018-12-19' 4 3000
1 A Z '2018-12-20' 3 2000
1 B Y '2018-12-21' 4 -3000")
df <- read.table(h=T,text="
id1 id2 id3 datee price quant
1 A Y '2018-12-19' 4 -3000
1 A Y '2018-12-04' 4 3000
1 A Z '2018-12-20' 3 2000")
Он должен удовлетворять нескольким требованиям:
A) Один возврат должен удалить только одну покупку и и наоборот
B) Несколько одинаковых возвратов должны возместить одинаковое количество идентичных покупок и и наоборот
C) Последняя покупка перед возврат должен быть сначала удален из данных (но не имеет значения, все ли последующие будут удалены в конце)
D) Различные id
или групповые переменные должны совпадать
Из всех методы, которые я попробовал, это было самым близким к моему решению:
df <- df %>%
mutate(refund = ifelse(quant < 0, 1, 0))
df_purchases_only <- df %>%
filter(refund == 0)
df_last_purchase_before_refund <- df %>%
filter(refund == 1) %>%
mutate(quant = abs(quant)) %>%
inner_join(df, by = c("datee", "id1", "id2", "id3", "price", "quant")) %>%
group_by(id1, id2, id3, price, quant) %>%
summarise(datee = max(datee))
df_cleaned <- df_purchases_only %>%
anti_join(df_last_purchase_before_refund, by = c("datee", "id1", "id2", "id3", "price", "quant")) %>%
select(-refund)
Проблема здесь в максимуме (datee), когда он только найдет любое количество покупок для различного количества идентичных возвратов.