繁体   English   中英

如何过滤 R 中行相互比较的条件

[英]How to filter for criteria where rows are compared to one another in R

我有一个 dataframe:

UserId <- c("A", "A", "A", "B", "B", "B")
SellerId <- c("X", "X", "Y", "Y", "Z", "Z")
Product <- c("ball", "ball", "ball", "ball", "doll", "doll")
SalesDate <- c("2022-01-01", "2022-01-01", "2022-01-02", "2022-01-04", "2022-01-06", "2022-01-07")

sales <- data.frame(UserId, SellerId, Product, SalesDate)

我想找到以下销售额:

  • 同一个用户在同一天两次从同一个卖家那里购买了同一个产品,但我当然需要做更大的规模。

很长一段时间以来,我一直在思考如何使用这些标准之一,但什么也没想到。 在这种情况下我应该留下的表格是:

用户身份 卖家编号 产品 销售日期
一种 X 2022-01-01
一种 X 2022-01-01

UserId 相同,卖家相同,产品相同,销售日期相同。 问题是我不寻找特定的用户或特定的产品。

我想找到所有两次购买相同产品的用户(无论产品是什么 - 列表很长),与 purchasedate 相同(日期无关紧要,同一用户需要相同) .

您是否知道如何执行部分代码?

使用dplyr ,您可以group_by_all变量,并filter掉不超过 1 条记录的任何内容。

library(dplyr)

sales %>% group_by_all() %>% filter(n() > 1)

# A tibble: 2 × 4
# Groups:   UserId, SellerId, Product, SalesDate [1]
  UserId SellerId Product SalesDate 
  <chr>  <chr>    <chr>   <chr>     
1 A      X        ball    2022-01-01
2 A      X        ball    2022-01-01

全部分组并使用filter @benson23 +1 的不同之处在于使用across

library(dplyr)
sales %>% 
  group_by(across(everything())) %>%
  filter( n() > 1 )

甚至everything()是默认的:

sales %>% 
  group_by(across()) %>%
  filter( n() > 1 )

使用add_count()将为您提供每次出现的次数。

sales %>%
  add_count(UserId, SellerId, Product,  SalesDate)

  UserId SellerId Product  SalesDate n
1      A        X    ball 2022-01-01 2
2      A        X    ball 2022-01-01 2
3      A        Y    ball 2022-01-02 1
4      B        Y    ball 2022-01-04 1
5      B        Z    doll 2022-01-06 1
6      B        Z    doll 2022-01-07 1

从那里你可以根据你的问题过滤n == 2n > 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM