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

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

我有一个数据框:

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)

并且我想查找以下销售额:

我考虑了很长时间如何使用这些标准之一,但没有想到。在这种情况下我应该留下的 table 是:

UserId SellerId Product SalesDate
A X ball 2022-01-01
A X ball 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

使用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

按所有人分组并使用filter。 @benson23 +1 的区别在于使用 across:

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

甚至默认为 everything()

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