Разделять многострочные транзакции на основе значений строк - PullRequest
0 голосов
/ 20 марта 2020

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

TRANSID GROSS AMNT  TRANSROWTYPE  
123         50          Z  
123         20          A  
123         30          A  
126         90          Z  
126         20          A  
126         30          A  
126         20          A  
…           ..          .  

Где,
TRANDIS - это идентификатор транзакции
GROSS AMNT - это полная сумма транзакции строка
TRANSROWTYPE - тип строки для транзакции.

Все транзакции имеют 2 типа строк

  1. Тип A: подробные строки транзакции. Транзакция может иметь 1 или несколько строк типа A.
  2. Тип Z: строка заголовка для транзакции. Транзакция может иметь только 1 тип строки Z.

В идеале для TRANSID сумма GROSS AMNT s в строках типа A должна равняться GROSS AMNT в строке типа Z.

В примере это верно для TRANSID=123, но не для TRANSID=126.

Мой запрос состоит в том, как отделить TRANSIDs, которые имеют
GROSS AMNTs в типе A rows = GROSS AMNT s в строке типа Z от тех, где эти два не равны ?

Мне особенно интересно найти решение, используя dplyr

Заранее большое спасибо.

Ответы [ 2 ]

0 голосов
/ 20 марта 2020

Существует множество способов получить желаемый результат с помощью пакета tidyverse, поэтому здесь есть еще один вариант.

library(tidyverse)

df %>%
  #Group by TRANS and TRANSROWTYPE
  group_by(TRANSID, TRANSROWTYPE) %>%
  #Get the sum of GROSS AMT by ID and row type
  summarise(sum_amt = sum(`GROSS AMNT`)) %>%
  #Ungroup
  ungroup() %>%
  #Group by ID
  group_by(TRANSID) %>%
  #Get distinct values
  distinct(sum_amt) %>%
  #Remove rows where sum_amt is the same for A and Z per ID (i.e., n = 1)
  #and stay only with rows where there are 2 distinct values
  filter(n() >= 2)
0 голосов
/ 20 марта 2020

Да, вы можете сделать это одним выстрелом с помощью dplyr. Сначала вы суммируете, чтобы сжать несколько строк одного типа. Это повлияет только на строки типа A, поскольку Z-строки в любом случае встречаются только один раз для каждого идентификатора перехода.

Сразу после суммирования вы выполняете pivot_wider (), поэтому значения для A и Z могут быть рядом на одном и том же строки, что позволяет очень легко сравнивать и фильтровать только те, которые соответствуют вашим критериям.

retail %>%
  group_by(TRANSID, TRANSROWTYPE) %>%
  summarise(TOTAL.AMT = sum(`GROSS AMNT`)) %>%
  ungroup() %>%
  pivot_wider(names_from = "TRANSROWTYPE", values_from = "TOTAL.AMT") %>%
  subset(A != Z)
...