group_by 跨多列的唯一计数

group_by unique counts across multiple columns

我有一个 table,其中包含有关商店和水果(苹果和橙子)的信息。每个商店都有一个库存,这些水果通过它们的 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()

我的问题是,我可以将以上两个合并到一行代码中,例如通过 summarize 函数吗?

你可以试试

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))

您可以在 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))