group_by 跨多个列的唯一计数
Posted
技术标签:
【中文标题】group_by 跨多个列的唯一计数【英文标题】:group_by unique counts across multiple columns 【发布时间】:2022-01-02 10:50:18 【问题描述】:我有一张关于商店和水果(苹果和橙子)信息的表格。每个商店都有一个库存,其中这些水果由它们的 ID 记录。
苹果和橙子可以是不同的类型,例如粉红女郎、皇家晚会、苹果前夜、苹果爵士等。当它们是不同的类型时,它们使用不同的 ID 存储。 但是当两个苹果属于同一类型时,它们将具有相同的 ID。我有兴趣计算每家商店有多少种不同类型的苹果和多少种不同类型的橙子。
我的输入是:
Shop Apple_id Orange_id
Coles 12 201
Woolies 20 51
Walmart 13 16
Woolies 20 52
Coles 14 202
Target 19 81
M&S 75 99
Coles 16 203
M&S 71 99
Dunnes 56 101
M&S 72 91
我的预期输出是:
Shop Apples Oranges
Coles 3 3
Dunnes 1 1
M&S 3 2
Target 1 1
Walmart 1 1
Woolies 1 2
我可以使用 dplyr()
包为每个水果一个一个地运行代码:
# Extract information on Apples only
library(dplyr)
apples_by_shop = raw %>%
group_by(shop) %>%
distinct(Apple_id) %>%
count()
同样,我可以编写代码来仅提取橙子的信息:
# Extract information on Oranges only
oranges_by_shop = raw %>%
group_by(shop) %>%
distinct(Orange_id) %>%
count()
我的问题是,我可以将以上两个合并到一行代码中,例如通过汇总函数吗?
【问题讨论】:
【参考方案1】:你可以试试
library(dplyr)
raw %>%
group_by(Shop) %>%
summarise(Apples = length(unique(Apple_id)),
Oranges = length(unique(Orange_id)))
Shop Apples Oranges
<chr> <int> <int>
1 Coles 3 3
2 Dunnes 1 1
3 M&S 3 2
4 Target 1 1
5 Walmart 1 1
6 Woolies 1 2
df %>%
group_by(Shop) %>%
summarise(Apples = n_distinct(Apple_id),
Oranges = n_distinct(Orange_id))
【讨论】:
谢谢,@Park。这太容易了。我一直在尝试distinct()
而不是unique()
和count()
而不是length()
。感谢迅速的反应。接受答案,因为它也在我的原始数据上运行。
@Sandy 类似于distinct
,你可以使用n_distinct
,它会给出正确的结果。我添加代码。
第二个选项更好,要学的东西太多了:)【参考方案2】:
你可以在base R中的一行中做到这一点。
aggregate(. ~ Shop, dat, function(x) length(unique(x)))
# Shop Apple_id Orange_id
# 1 Coles 3 3
# 2 Dunnes 1 1
# 3 M&S 3 2
# 4 Target 1 1
# 5 Walmart 1 1
# 6 Woolies 1 2
数据:
dat <- structure(list(Shop = c("Coles", "Woolies", "Walmart", "Woolies",
"Coles", "Target", "M&S", "Coles", "M&S", "Dunnes", "M&S"), Apple_id = c(12L,
20L, 13L, 20L, 14L, 19L, 75L, 16L, 71L, 56L, 72L), Orange_id = c(201L,
51L, 16L, 52L, 202L, 81L, 99L, 203L, 99L, 101L, 91L)), class = "data.frame", row.names = c(NA,
-11L))
【讨论】:
以上是关于group_by 跨多个列的唯一计数的主要内容,如果未能解决你的问题,请参考以下文章