Как группировать по всем столбцам, кроме одного, в dplyr
Вы можете использовать следующий базовый синтаксис для группировки всех столбцов во фрейме данных, кроме одного, с помощью пакета dplyr в R:
df %>%
group_by(across(c( - this_column)))
В этом конкретном примере фрейм данных группируется по всем столбцам, кроме столбца с именем this_column .
Обратите внимание, что отрицательный знак ( – ) в формуле указывает dplyr исключить этот конкретный столбец из функции group_by() .
В следующем примере показано, как использовать этот синтаксис на практике.
Пример: группировка по всем столбцам, кроме одного в dplyr
Предположим, у нас есть следующий кадр данных в R, содержащий информацию о различных баскетболистах:
#create data frame df <- data. frame (team=c('A', 'A', 'A', 'A', 'B', 'B', 'B', 'B'), position=c('G', 'G', 'F', 'F', 'G', 'G', 'F', 'F'), starter=c('Y', 'Y', 'Y', 'N', 'Y', 'N', 'N', 'N'), dots=c(99, 104, 119, 113)) #view data frame df team position starter points 1 AGY 99 2 AGY 104 3 AFY 119 4 AFN 113 5 BGY 99 6 BGN 104 7 BFN 119 8 BFN 113
Теперь предположим, что мы хотим найти максимальное значение в столбце точек , сгруппированное по всем остальным столбцам во фрейме данных.
Для этого мы можем использовать следующий синтаксис:
library (dplyr) #group by all columns except points column and find max points df %>% group_by(across(c( - points))) %>% mutate(max_points = max(points)) # A tibble: 8 x 5 # Groups: team, position, starter [6] team position starter points max_points 1 AGY 99 104 2 AGY 104 104 3 AFY 119 119 4 AFN 113 113 5 BGY 99 99 6 BGN 104 104 7 BFN 119 119 8 BFN 113 119
По результату мы видим:
- Максимальное количество очков для всех игроков со значением команды A, значением позиции G и стартовым значением Y составляло 104 .
- Максимальное количество очков для всех игроков со значением команды A, значением позиции F и стартовым значением Y составляло 119 .
- Максимальное количество очков для всех игроков со значением команды A, значением позиции F и стартовым значением N составляло 113 .
И так далее.
Обратите внимание, что мы могли бы получить тот же результат, если бы ввели все имена столбцов, кроме точек, в функцию group_by() :
library (dplyr) #group by all columns except points column and find max points df %>% group_by(across(c(team, position, starter))) %>% mutate(max_points = max(points)) # A tibble: 8 x 5 # Groups: team, position, starter [6] team position starter points max_points 1 AGY 99 104 2 AGY 104 104 3 AFY 119 119 4 AFN 113 113 5 BGY 99 99 6 BGN 104 104 7 BFN 119 119 8 BFN 113 119
Это соответствует результату предыдущего примера.
Однако обратите внимание, что гораздо проще исключить столбец точек в функции group_by() , чем вводить имена всех остальных столбцов.
Дополнительные ресурсы
В следующих руководствах объясняется, как выполнять другие распространенные задачи с помощью dplyr:
Как фильтровать строки, содержащие определенную строку, с помощью dplyr
Как рассчитать относительные частоты с помощью dplyr
Как выбрать первую строку по группе с помощью dplyr