Raggruppamento di dati con R | Integrato

I dati di per sé possono essere piuttosto interessanti, ma anche se hai a che fare con un piccolo set di dati, è probabile che tu debba riassumere o aggregare esso. Ecco dove avremo bisogno di gruppi.

Sebbene sia utile conoscere l’importo totale delle vendite, spesso è più utile conoscere l’importo totale delle vendite per venditore o per mese.

Come raggruppare i dati con R

  1. Carica il set di dati in Tibble.
  2. Immettere la funzione group_by per raggruppare le informazioni.
  3. Usa il riepilogo per analizzare i tuoi dati.
  4. Crea una nuova colonna con muta.
  5. Separa i tuoi dati con ungroup().

Raggruppare i dati è innegabilmente essenziale per analisi dei datie analizzerò alcuni dei metodi per farlo con RTidyverse e dplyr.

il set di dati Userò per i prossimi esempi viene da Kaggle e contiene le migliori canzoni di Spotify dal 2010 al 2019.

library("tidyverse")

df <- read_csv('data/spotify.csv') %>%
 rename(genre = `top genre`)
Screenshot dei dati del genere più alto di Spotify.
Screenshot dei dati del genere più alto di Spotify. | Screenshot: Thiago Carvalho

Ora il nostro set di dati viene caricato su un Tibble, che contiene 603 record e 15 colonne.

Come raggruppare i dati con R

Ora raggruppiamo i dati per genere e vediamo cosa otteniamo.

# group by genre
df %>%
 group_by(genre)
Dati raggruppati.
Dati raggruppati. | Screenshot: Thiago Carvalho

Non c’è quasi nessuna differenza nei risultati, ma ora la seconda riga ha alcune informazioni sul gruppo. Può sembrare che nulla sia cambiato, ma poiché i dati sono raggruppati, verranno trattati in modo diverso nelle operazioni successive.

Diventa un esperto in R: Programmazione R AZ™: R per la scienza dei dati con esercizi reali!

Come analizzare i dati durante il raggruppamento in R

possiamo usare summarise per osservare questa differenza, per prima cosa, facciamolo senza gruppi.

df %>%
 summarise(summary = mean(bpm))
Dati riassunti.
Dati riepilogati | Screenshot: Thiago Carvalho

Poiché non abbiamo gruppi, R restituisce il valore medio per l’intero set di dati.

df %>%
 group_by(genre) %>%
 summarise(mean_bpm = mean(bpm))
Dati raggruppati e “riassunti”.
Dati raggruppati e “riassunti”. | Screenshot: Thiago Carvalho

Ora abbiamo valori univoci sul genere e sui rispettivi battiti medi al minuto (bpm).

Nota che questo nuovo Tibble non ha più le informazioni del gruppo.

Un tutorial su come utilizzare la funzione group_by in R. | Video: Programmazione R – DDS

Come creare una nuova colonna durante il raggruppamento in R

Ora creeremo una nuova colonna con mutateinvece di summarise. Per prima cosa, vedremo il risultato senza raggruppare:

# mutate without grouping
df %>%
 mutate(mean_bpm = (bpm - mean(bpm))^2) %>%
 select(genre, mean_bpm)
Dati calcolati con la media bpm di tutti i valori.
Dati calcolati con la media bpm di tutti i valori. | Screenshot: Thiago Carvalho
# mutate with grouping
df %>%
 group_by(genre) %>%
 mutate(mean_bpm = (bpm - mean(bpm))^2) %>%
 select(genre, mean_bpm)
Dati calcolati con la media bpm di ciascun gruppo.
Dati calcolati con la media bpm di ciascun gruppo.| Screenshot: Thiago Carvalho

I risultati sono molto diversi. Sul primo, abbiamo iterato ogni record, ottenendo i suoi bpm, quindi lo abbiamo diviso per la media di tutti i record e quadrato il risultato.

Sul secondo, abbiamo fatto la stessa cosa ma divisi per i bpm medi dei record in quel gruppo. Possiamo anche vedere che anche dopo aver usato mutate, i nostri dati sono ancora raggruppati.

Come separare i tuoi dati in R

Se abbiamo bisogno di cambiarlo, possiamo farlo facilmente ungroup per eseguire altre operazioni.

df %>%
 group_by(genre) %>%
 mutate(mean_bpm = mean(bpm) %>%
 select(genre, mean_bpm) %>%
 mutate(my_grouped_sum = sum(mean_bpm)) %>%
 ungroup() %>%
 mutate(my_regular_sum = sum(mean_bpm))
Funzione muta eseguita su dati raggruppati e non raggruppati.
Funzione muta eseguita su dati raggruppati e non raggruppati. | Screenshot: Thiago Carvalho

È facile confondere il tuo set di dati con la sua versione raggruppata, quindi ti consigliamo di separare sempre i tuoi dati prima di salvare i risultati in una variabile.

Lo sappiamo group_by restituirà un Tibble molto simile al nostro Tibble standard. La differenza è nel modo in cui gestirà le operazioni successive.

Come raggruppare più campi in R

anche l’utilizzo di più campi per raggruppare i dati è abbastanza semplice; possiamo aggiungerli come parametri sul nostro group_by.

# multiple fields
df %>%
 group_by(genre, year) %>%
 summarise(rec_count = n()) %>%
 arrange(desc(year), desc(rec_count))
Raggruppati e “riassunti” per genere e anno.
Raggruppati e “riassunti” per genere e anno. | Screenshot: Thiago Carvalho

L’ultima volta che abbiamo usato summarise, ha restituito un Tibble senza gruppi. Ora che stiamo usando più variabili, abbiamo ancora un gruppo nel risultato.

Sebbene Tibble raggruppato e non raggruppato sembrino simili, non lo sono. Ripetiamo questo codice, aggiungendo una colonna con il conteggio dopo summarise e un altro dopo la separazione.

# multiple fields
df %>%
 group_by(genre, year) %>%
 summarise(genre_year_count = n()) %>%
 arrange(desc(year), desc(genre_year_count)) %>%
 mutate(genre_count = n()) %>%
 ungroup() %>%
 mutate(total_count = n())
I dati mutano dopo il riepilogo e dopo la separazione.
I dati mutano dopo il riepilogo e dopo la separazione. | Screenshot: Thiago Carvalho

A volte potremmo eseguire alcune operazioni con un gruppo e quindi dover aggiungere un altro campo al nostro group_by.

usare un group_by dopo l’altro sostituisce il precedente, ma possiamo impostare il parametro add su “vero” per completare quell’azione.

df %>%
 group_by(genre) %>%
 mutate(mean_bpm_genre = mean(bpm)) %>%
 group_by(year, add = TRUE) %>%
 mutate(mean_bpm_genre_year = mean(bpm)) %>%
 select(genre, year, mean_bpm_genre, mean_bpm_genre_year)
Tibble con il gruppo aggiunto.
Tibble con il gruppo aggiunto. | Screenshot: Thiago Carvalho

Raggruppa in R con variabili e funzioni

Ora, proviamo a usare group_by più programmaticamente. Cercheremo di definire una funzione, passare il gruppo come parametro, eseguire un semplice conteggio e ottenere i risultati.

my_func <- function(df, group){
 df %>%
   group_by(group) %>%
   summarise(my_count = n()) %>%
   arrange(desc(my_count))
}

my_func(df, 'year')

Errore nei dati.  |  Screenshot: Thiago Carvalho

Non è così semplice. Abbiamo bisogno di apportare alcune modifiche per farlo funzionare. uno possibile soluzione è da usare quosure.

my_func <- function(df, group){
 df %>%
   group_by(!!group) %>%
   summarise(my_count = n()) %>%
   arrange(desc(my_count))
}

my_group = quo(year)
my_func(df, my_group)
Funziona con quosure.
Funziona con quosure. | Screenshot: Thiago Carvalho

potremmo anche usare group_by_.

Molti verbi dplyr hanno una versione alternativa con una sottolineatura extra alla fine. Questi possono aiutarci a usare metodi come group_by più programmaticamente.

Dplyr utilizza una valutazione non standard per la maggior parte dei suoi verbi a tabella singola, tra cui: filter(), mutate(), summarise(), arrange(), select() e group_by(). Sebbene sia più veloce da digitare e renda possibile tradurre il codice in SQL, è difficile da programmare. Consiglio di dare un’occhiata questo pacchetto per facilitare il lavoro.

Proviamo di nuovo la funzione, questa volta con group_by_.

my_func <- function(df, group){
 df %>%
   group_by_(group) %>%
   summarise(my_count = n()) %>%
   arrange(desc(my_count))
}

my_func(df, 'genre')
Funzione con i verbi SE.
Funzione con i verbi SE. | Screenshot: Thiago Carvalho

È più facile che usare quosureè più leggibile e produce lo stesso risultato.

Abbiamo esplorato le basi di group_bycome utilizzare più campi per raggruppare i nostri dati, le differenze tra un Tibble raggruppato e un normale e come utilizzare group_by_ per ottenere soluzioni più programmatiche.

Maggiori informazioni sulla scienza dei dati: La correlazione non è causa

Raggruppamento in varianti R

Ci sono alcune varianti come group_by_all e group_by_if. Per quanto siano considerati sostituiti dall’uso di acrossvale la pena dare un’occhiata anche a loro.

Raggruppamento in R Varianti da conoscere

  • Raggruppa_per_tutti: Consente all’utente di utilizzare tutti i campi del set di dati.
  • Raggruppa_per_se: Consente di utilizzare una funzione if per raggruppare determinati campi.
  • Group_Split: Ciò consente all’utente di separare i dati in un elenco di Tibbles.
  • Gruppo_Nido: Questo restituisce un Tibble contenente le colonne raggruppate ei dati di quei rispettivi gruppi.

gruppo_per_tutti

Il nome lo tradisce, group_by_all utilizza tutti i campi del set di dati. Come accennato, lo stesso può essere fatto utilizzando group_by e across.

new_df <- select(df, genre, year)

new_df %>%
 group_by_all() %>%
 summarise(my_cnt = n()) %>%
 arrange(desc(my_cnt))

new_df %>%
 group_by(across()) %>%
 summarise(my_cnt = n()) %>%
 arrange(desc(my_cnt))
Il risultato di entrambi i metodi.
Il risultato di entrambi i metodi. | Screenshot: Thiago Carvalho

Non mi sono mai trovato in una situazione in cui dovevo raggruppare tutte le colonne, ma in alcuni casi potrebbe tornare utile ed è bello sapere che esiste.

gruppo_per_se

Un’altra variante affascinante è group_by_ifche ci consente di utilizzare una funzione per selezionare i campi.

# group_by_if
new_df <- df %>%
 mutate(artist = as.factor(artist),
        genre = as.factor(genre))

new_df %>%
 group_by_if(is.factor) %>%
 summarise(my_cnt = n()) %>%
 arrange(desc(my_cnt))

new_df %>%
 group_by(across(where(is.factor))) %>%
 summarise(my_cnt = n()) %>%
 arrange(desc(my_cnt))
Il risultato di entrambi i metodi.
Il risultato di entrambi i metodi. | Screenshot: Thiago Carvalho

Proviamo un altro esempio con una funzione personalizzata. Raggrupperemo le colonne in cui qualsiasi record contiene la parola “danza” su di esse.

new_df %>%
 group_by_if(function(x) any(grepl("dance", x, fixed=TRUE))) %>%
 summarise(my_cnt = n())
Raggruppa per con una funzione personalizzata.
Raggruppa per con una funzione personalizzata. | Screenshot: Thiago Carvalho

Dividi e nidifica

A volte avremo anche bisogno di trattamenti diversi per gruppi diversi. Questo è reso semplice con group_splitche separa i nostri dati in un elenco di Tibbles, uno per ogni gruppo.

In questo esempio, raggrupperemo i dati per anno, li divideremo e salveremo il risultato in una variabile chiamata df_list.

Per testare, possiamo selezionare un indice di questo elenco. In cambio, dovremmo ottenere un Tibble contenente solo i record di un anno.

# split
df_list <- df %>%
 group_by(year) %>%
 group_split()

df_list[[10]]
Un Tibble con solo record del 2019.
Un Tibble con solo record del 2019. | Screenshot: Thiago Carvalho

Una soluzione più sofisticata per separare i nostri gruppi è group_nestche restituisce un Tibble contenente le colonne raggruppate e i dati dei rispettivi gruppi.

# nest
df_nest <- df %>%
 group_nest(genre, year)

df_nest
Gruppi nidificati.
Gruppi nidificati. | Screenshot: Thiago Carvalho

Esistono molti modi per raggruppare i nostri dati e manipolarli una volta raggruppati, ma credo che abbiamo coperto abbastanza per le basi.

.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *