根据行值分离 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 种类型的行
- 类型
A
:交易的详细行。一个事务可以有 1 个或多个 Type A
行。
- 键入
Z
:交易的 Header 行。一个事务只能有 1 个 Type Z
行。
理想情况下,对于 TRANSID
,类型 A
行中 GROSS AMNT
的总和应等于类型 Z
行中的 GROSS AMNT
。
在示例中,TRANSID=123
是这样,但 TRANSID=126
不是这样。
我的问题是如何隔离
的 TRANSIDs
GROSS AMNTs
in Type A
rows= GROSS AMNT
s 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)
我有一个零售交易数据集,如下所示:
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 种类型的行
- 类型
A
:交易的详细行。一个事务可以有 1 个或多个 TypeA
行。 - 键入
Z
:交易的 Header 行。一个事务只能有 1 个 TypeZ
行。
理想情况下,对于 TRANSID
,类型 A
行中 GROSS AMNT
的总和应等于类型 Z
行中的 GROSS AMNT
。
在示例中,TRANSID=123
是这样,但 TRANSID=126
不是这样。
我的问题是如何隔离
的 TRANSIDs
GROSS AMNTs
in Type A
rows= GROSS AMNT
s 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)