[英]How to select rows with 2 specific criteria where one criteria depends on what is the value of another
[英]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 == 2
或n > 1
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.