Как группировать по всем столбцам, кроме одного, в 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *