group_by 跨多列的唯一计数
group_by unique counts across multiple columns
我有一个 table,其中包含有关商店和水果(苹果和橙子)的信息。每个商店都有一个库存,这些水果通过它们的 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()
我的问题是,我可以将以上两个合并到一行代码中,例如通过 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))
我有一个 table,其中包含有关商店和水果(苹果和橙子)的信息。每个商店都有一个库存,这些水果通过它们的 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()
我的问题是,我可以将以上两个合并到一行代码中,例如通过 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))