R: возврат в панели данных - PullRequest
0 голосов
/ 20 января 2020

Когда-либо возникающая проблема - ранее задавался вопрос: 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), когда он только найдет любое количество покупок для различного количества идентичных возвратов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...