Come raggruppare per tutte le colonne tranne una in dplyr
È possibile utilizzare la seguente sintassi di base per raggruppare tutte le colonne tranne una in un frame di dati utilizzando il pacchetto dplyr in R:
df %>%
group_by(across(c( - this_column)))
Questo particolare esempio raggruppa il frame di dati in base a tutte le colonne tranne quella chiamata this_column .
Tieni presente che il segno negativo ( – ) nella formula indica a dplyr di escludere quella particolare colonna nella funzione group_by() .
L’esempio seguente mostra come utilizzare questa sintassi nella pratica.
Esempio: raggruppa per tutte le colonne tranne una in dplyr
Supponiamo di avere il seguente frame di dati in R che contiene informazioni su vari giocatori di basket:
#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
Supponiamo ora di voler trovare il valore massimo nella colonna dei punti , raggruppato su tutte le altre colonne nel frame di dati.
Possiamo usare la seguente sintassi per fare questo:
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
Dal risultato possiamo vedere:
- Il valore in punti massimo per tutti i giocatori con valore di squadra A, valore di posizione G e valore iniziale Y era 104 .
- Il valore in punti massimo per tutti i giocatori con un valore di squadra A, un valore di posizione F e un valore iniziale di Y era 119 .
- Il valore in punti massimo per tutti i giocatori con un valore di squadra A, un valore di posizione F e un valore iniziale di N era 113 .
E così via.
Tieni presente che potremmo ottenere lo stesso risultato anche se digitassimo tutti i nomi di colonna tranne i punti nella funzione 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
Ciò corrisponde al risultato dell’esempio precedente.
Tuttavia, tieni presente che è molto più semplice escludere la colonna dei punti nella funzione group_by() piuttosto che digitare i nomi di tutte le altre colonne.
Risorse addizionali
I seguenti tutorial spiegano come eseguire altre attività comuni utilizzando dplyr:
Come filtrare le righe contenenti una determinata stringa utilizzando dplyr
Come calcolare le frequenze relative utilizzando dplyr
Come selezionare la prima riga per gruppo utilizzando dplyr