Вы можете использовать следующие методы для подсчета количества уникальных значений по группам в R:
Способ 1: Использование базы R
results <- aggregate(data=df, values_var~group_var, function (x) length ( unique (x)))
Способ 2: использование dplyr
library(dplyr)
results <- df %>%
group_by(group_var) %>%
summarize(count = n_distinct (values_var))
Способ 3: Использование data.table
library (data.table)
df <- data.table(df)
results <- df[ , .(count = length ( unique (values_var))), by = group_var]
Каждый метод возвращает один и тот же результат, но базовый метод R, как правило, значительно медленнее при работе с большими фреймами данных.
В следующих примерах показано, как использовать каждый из этих методов на практике со следующим фреймом данных:
#create data frame
df <- data.frame(team=c('A', 'A', 'A', 'A', 'B', 'B', 'C', 'C', 'C'),
points=c(10, 10, 14, 14, 18, 19, 20, 20, 20))
#view data frame
df
team points
1 A 10
2 A 10
3 A 14
4 A 14
5 B 18
6 B 19
7 C 20
8 C 20
9 C 20
Метод 1: подсчет уникальных значений по группам с использованием базы R
В следующем коде показано, как подсчитать количество различных значений очков для каждой команды с использованием базы R:
#count unique points values by team
results <- aggregate(data=df, points~team, function (x) length ( unique (x)))
#view results
results
team points
1 A 2
2 B 2
3 C 1
Из вывода мы видим:
- Для команды А существует 2 уникальных значения очков.
- Есть 2 уникальных значения очков для команды B.
- Для команды C существует 1 уникальное значение очков.
Метод 2: подсчет уникальных значений по группам с использованием dplyr
В следующем коде показано, как подсчитать количество различных значений очков для каждой команды с помощью dplyr:
library(dplyr)
#count unique points values by team
results <- df %>%
group_by(team) %>%
summarize(count = n_distinct (points))
#view results
results
# A tibble: 3 x 2
team count
1 A 2
2 B 2
3 C 1
Обратите внимание, что эти результаты совпадают с результатами базового метода R.
Способ 3: подсчет уникальных значений по группам с использованием data.table
В следующем коде показано, как подсчитать количество различных значений баллов для каждой команды с помощью data.table:
library (data.table)
#convert data frame to data table
df <- data.table(df)
#count unique points values by team
results <- df[ , .(count = length ( unique (points))), by = team]
#view results
results
team count
1: A 2
2: B 2
3: C 1
Обратите внимание, что эти результаты совпадают с результатами предыдущих двух методов.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные операции с помощью dplyr:
Как перекодировать значения с помощью dplyr
Как заменить NA на ноль в dplyr
Как ранжировать переменные по группам с помощью dplyr
Как выбрать первую строку по группе с помощью dplyr