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 跨多个列的唯一计数的主要内容,如果未能解决你的问题,请参考以下文章

跨多个表的列的 SQL 唯一约束

Dplyr唯一计数和同一数据帧中的一般计数

大数据集群跨多版本升级业务0中断,只因背后有TA

Angular项目间的模板共享:如何跨多项目重用公共HTML

R中唯一值的累积计数

跨案例选择不同计数