Gegevens groeperen met R | Ingebouwd

Data op zich kan best interessant zijn, maar zelfs als je te maken hebt met een kleine dataset, is de kans groot dat je samenvatten of aggregeren het. Daar hebben we groepen nodig.

Hoewel het leuk is om het totale aantal verkopen te weten, is het vaak handiger om het totale aantal verkopen per verkoper of per maand te kennen.

Gegevens groeperen met R

  1. Laad de dataset in Tibble.
  2. Voer de functie group_by in om de informatie te groeperen.
  3. Gebruik samenvatten om uw gegevens te analyseren.
  4. Maak een nieuwe kolom met muteren.
  5. Degroepeer uw gegevens met ungroup().

Het groeperen van gegevens is onmiskenbaar essentieel voor: data-analyseen ik zal enkele methoden onderzoeken om dit te doen met RTidyverse en dplyr.

De dataset Ik gebruik voor de volgende voorbeelden komt van Kaggle en bevat de topnummers van Spotify van 2010 tot 2019.

library("tidyverse")

df <- read_csv('data/spotify.csv') %>%
 rename(genre = `top genre`)
Screenshot van de Spotify topgenre data.
Screenshot van de Spotify topgenre data. | Screenshot: Thiago Carvalho

Nu wordt onze dataset geladen in een Tibble, die 603 records en 15 kolommen bevat.

Gegevens groeperen met R

Laten we nu de gegevens groeperen op genre en kijken wat we krijgen.

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

Er is bijna geen verschil in de resultaten, maar nu heeft de tweede regel wat informatie over de groep. Het lijkt misschien dat er niets is veranderd, maar aangezien de gegevens zijn gegroepeerd, zullen ze bij de volgende bewerkingen anders worden behandeld.

Word een expert in R: R Programming AZ™: R voor datawetenschap met echte oefeningen!

Gegevens analyseren tijdens het groeperen in R

We kunnen gebruiken summarise om dit verschil waar te nemen, laten we het eerst zonder groepen doen.

df %>%
 summarise(summary = mean(bpm))
Samengevatte gegevens.
samengevatte gegevens | Screenshot: Thiago Carvalho

Omdat we geen groepen hadden, retourneert R de gemiddelde waarde voor de hele dataset.

df %>%
 group_by(genre) %>%
 summarise(mean_bpm = mean(bpm))
Gegroepeerde en
Gegroepeerde en „samengevatte“ gegevens. | Screenshot: Thiago Carvalho

Nu hebben we unieke waarden voor het genre en hun respectievelijke gemiddelde beats per minuut (bpm).

Merk op dat deze nieuwe Tibble de informatie van de groep niet meer heeft.

Een tutorial over het gebruik van de group_by functie in R. | Video: R-programmering – DDS

Een nieuwe kolom maken tijdens het groeperen in R

Nu maken we een nieuwe kolom met mutatein plaats van summarise. Eerst zien we het resultaat zonder te groeperen:

# mutate without grouping
df %>%
 mutate(mean_bpm = (bpm - mean(bpm))^2) %>%
 select(genre, mean_bpm)
Gegevens berekend met de gemiddelde bpm van alle waarden.
Gegevens berekend met de gemiddelde bpm van alle waarden. | Screenshot: Thiago Carvalho
# mutate with grouping
df %>%
 group_by(genre) %>%
 mutate(mean_bpm = (bpm - mean(bpm))^2) %>%
 select(genre, mean_bpm)
Gegevens berekend met de gemiddelde bpm van elke groep.
Gegevens berekend met de gemiddelde bpm van elke groep.| Screenshot: Thiago Carvalho

De resultaten zijn heel verschillend. Bij de eerste hebben we elk record herhaald, zijn bpm verkregen, het vervolgens gedeeld door het gemiddelde van alle records en het resultaat gekwadrateerd.

Bij de tweede deden we hetzelfde, maar gedeeld door de gemiddelde bpm van de records in die groep. We kunnen ook zien dat zelfs na het gebruik van muteren, onze gegevens nog steeds gegroepeerd zijn.

Hoe u uw gegevens kunt degroeperen in R

Als we dat moeten veranderen, kunnen we dat gemakkelijk doen met ungroup om andere handelingen uit te voeren.

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))
Mutatiefunctie uitgevoerd op gegroepeerde en niet-gegroepeerde gegevens.
Mutatiefunctie uitgevoerd op gegroepeerde en niet-gegroepeerde gegevens. | Screenshot: Thiago Carvalho

Het is gemakkelijk om uw dataset te verwarren met de gegroepeerde versie, dus het is aan te raden dat u uw gegevens altijd degroepeert voordat u de resultaten opslaat in een variabele.

We weten dat group_by zal een Tibble retourneren die erg lijkt op onze standaard Tibble. Het verschil zit ‚m in hoe het de volgende bewerkingen zal afhandelen.

Meerdere velden groeperen in R

Het gebruik van meerdere velden om de gegevens te groeperen is ook vrij eenvoudig; we kunnen ze als parameters toevoegen aan onze group_by.

# multiple fields
df %>%
 group_by(genre, year) %>%
 summarise(rec_count = n()) %>%
 arrange(desc(year), desc(rec_count))
Gegroepeerd en “samengevat” op genre en jaar.
Gegroepeerd en “samengevat” op genre en jaar. | Screenshot: Thiago Carvalho

De laatste keer dat we gebruikten summarise, het gaf een Tibble terug zonder groepen. Nu we meerdere variabelen gebruiken, hebben we nog steeds een groep in het resultaat.

Hoewel de gegroepeerde en niet-gegroepeerde Tibble er hetzelfde uitzien, zijn ze dat niet. Laten we deze code herhalen en een kolom toevoegen met de telling erna summarise en een andere na het opheffen van de groepering.

# 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())
Gegevens muteren na samenvatten en na degroepering.
Gegevens muteren na samenvatten en na degroepering. | Screenshot: Thiago Carvalho

Soms voeren we enkele bewerkingen uit met een groep en moeten we dan een ander veld toevoegen aan onze group_by.

Met behulp van een group_by na de andere vervangt de vorige, maar we kunnen de parameter instellen add naar „true“ om die actie te voltooien.

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 met de toegevoegde groep.
Tibble met de toegevoegde groep. | Screenshot: Thiago Carvalho

Groeperen in R met variabelen en functies

Laten we nu proberen om group_by meer programmatisch. We zullen proberen een functie te definiëren, de groep als parameter door te geven, een eenvoudige telling uit te voeren en de resultaten te krijgen.

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

my_func(df, 'year')

Fout in de gegevens.  |  Screenshot: Thiago Carvalho

Het is niet zo eenvoudig. We moeten een paar aanpassingen maken om dit te laten werken. een mogelijke oplossing is om te gebruiken 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)
Functie met quosure.
Functie met quosure. | Screenshot: Thiago Carvalho

We zouden ook kunnen gebruiken group_by_.

Veel dplyr-werkwoorden hebben een alternatieve versie met een extra onderstreping aan het einde. Die kunnen ons helpen methoden te gebruiken zoals: group_by meer programmatisch.

Dplyr gebruikt niet-standaard evaluatie voor de meeste van zijn enkele tabelwerkwoorden, waaronder: filter(), mutate(), summarise(), arrange(), select() en group_by(). Hoewel het sneller is om te typen en het mogelijk maakt om de code in SQL te vertalen, is het moeilijk te programmeren. Ik raad aan om uit te checken dit pakket om het gemakkelijker te maken om mee te werken.

Laten we de functie opnieuw proberen, deze keer met group_by_.

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

my_func(df, 'genre')
Functie met SE-werkwoorden.
Functie met SE-werkwoorden. | Screenshot: Thiago Carvalho

Dat is makkelijker dan gebruiken quosurehet is beter leesbaar en levert hetzelfde resultaat op.

We verkenden de basis van group_byhoe u meerdere velden kunt gebruiken om onze gegevens te groeperen, de verschillen tussen een gegroepeerde en een gewone Tibble, en hoe u group_by_ om tot meer programmatische oplossingen te komen.

Meer over datawetenschap: Correlatie is geen oorzakelijk verband

Groeperen in R-varianten

Er zijn enkele varianten zoals: group_by_all en group_by_if. Zoveel als ze worden beschouwd als vervangen door het gebruik van acrossis het de moeite waard om ze ook eens te bekijken.

Groeperen in R-varianten om te weten

  • Group_by_all: Hiermee kan de gebruiker elk veld in de dataset gebruiken.
  • Group_by_if: Hiermee kunt u een if-functie gebruiken om bepaalde velden te groeperen.
  • Groep_Splitsen: Hierdoor kan de gebruiker de gegevens scheiden in een lijst met Tibbles.
  • Groep_Nest: Dit retourneert een Tibble met de gegroepeerde kolommen en de gegevens van die respectievelijke groepen.

Group_by_all

De naam verraadt het, group_by_all gebruikt elk veld in de dataset. Zoals vermeld, kan hetzelfde worden gedaan met group_by en 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))
Het resultaat van beide methoden.
Het resultaat van beide methoden. | Screenshot: Thiago Carvalho

Ik heb mezelf nooit in een situatie bevonden waarin ik alle kolommen moest groeperen, maar het kan in sommige gevallen van pas komen, en het is goed om te weten dat het bestaat.

Group_by_if

Een andere fascinerende variant is group_by_ifwaarmee we een functie kunnen gebruiken om de velden te selecteren.

# 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))
Het resultaat van beide methoden.
Het resultaat van beide methoden. | Screenshot: Thiago Carvalho

Laten we een ander voorbeeld proberen met een aangepaste functie. We groeperen de kolommen waarin een record het woord ‚dans‘ bevat.

new_df %>%
 group_by_if(function(x) any(grepl("dance", x, fixed=TRUE))) %>%
 summarise(my_cnt = n())
Groeperen op met een aangepaste functie.
Groeperen op met een aangepaste functie. | Screenshot: Thiago Carvalho

Splitsen en nesten

Soms hebben we ook verschillende behandelingen nodig voor verschillende groepen. Dat is eenvoudig gemaakt met group_splitdie onze gegevens scheidt in een lijst met Tibbles, één voor elke groep.

In dit voorbeeld zullen we de gegevens per jaar groeperen, splitsen en het resultaat opslaan in een variabele met de naam df_list.

Om te testen kunnen we een index van deze lijst selecteren. In ruil daarvoor zouden we een Tibble moeten krijgen met alleen de records van één jaar.

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

df_list[[10]]
Een Tibble met alleen 2019 records.
Een Tibble met alleen 2019 records. | Screenshot: Thiago Carvalho

Een meer geavanceerde oplossing voor het scheiden van onze groepen is: group_nestdie een Tibble retourneert met de gegroepeerde kolommen en de gegevens van die respectieve groepen.

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

df_nest
Geneste groepen.
Geneste groepen. | Screenshot: Thiago Carvalho

Er zijn tal van manieren om onze gegevens te groeperen en te manipuleren als ze eenmaal gegroepeerd zijn, maar ik denk dat we genoeg hebben behandeld voor de basis.

.

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert