根据行值分离 multi-line 个事务

Segregate multi-line transactions based on row values

我有一个零售交易数据集,如下所示:

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 个或多个 Type A 行。
  2. 键入 Z:交易的 Header 行。一个事务只能有 1 个 Type Z 行。

理想情况下,对于 TRANSID,类型 A 行中 GROSS AMNT 的总和应等于类型 Z 行中的 GROSS AMNT

在示例中,TRANSID=123 是这样,但 TRANSID=126 不是这样。

我的问题是如何隔离
TRANSIDs GROSS AMNTs in Type A rows= GROSS AMNTs in Type Z row 从那些地方两者不相等?

我对使用 dplyr

找到解决方案特别感兴趣

非常感谢。

是的,您可以使用 dplyr 一次性完成。首先,您汇总以压缩相同类型的多行。它只会影响 A 类型的行,因为对于每个交易 ID,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)

有很多方法可以使用 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)