0

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

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 个或多个 TypeA行。
  2. 类型Z:交易的标题行。一个事务只能有 1 个类型Z行。

理想情况下,对于 a ,Type 行中sTRANSID的总和应该等于 Type 行中的the 。GROSS AMNTAGROSS AMNTZ

在示例中,这对于 是正确的TRANSID=123,但对于 不是TRANSID=126

我的查询是如何将Type rows= s in Type row 中的TRANSIDs那些与两者不相等的那些分开?
GROSS AMNTsAGROSS AMNTZ

我特别有兴趣找到使用的解决方案dplyr

提前谢谢了。

4

2 回答 2

0

是的,您可以使用 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)
于 2020-03-19T22:31:27.297 回答
0

有很多方法可以使用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)
于 2020-03-19T22:49:06.770 回答