如何过滤 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 == 2
或 n > 1
。
按所有人分组并使用filter
。 @benson23 +1 的区别在于使用 across
:
library(dplyr)
sales %>%
group_by(across(everything())) %>%
filter( n() > 1 )
甚至默认为 everything()
:
sales %>%
group_by(across()) %>%
filter( n() > 1 )
我有一个数据框:
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 == 2
或 n > 1
。
按所有人分组并使用filter
。 @benson23 +1 的区别在于使用 across
:
library(dplyr)
sales %>%
group_by(across(everything())) %>%
filter( n() > 1 )
甚至默认为 everything()
:
sales %>%
group_by(across()) %>%
filter( n() > 1 )