Zoeken…


Opmerkingen

dplyr is een iteratie van plyr die een flexibele op "werkwoord" gebaseerde functies biedt om gegevens in R te manipuleren. De nieuwste versie van dplyr kan worden gedownload van CRAN met

install.package("dplyr")

Het sleutelobject in dplyr is een tbl, een weergave van een gegevensstructuur in tabelvorm. Momenteel ondersteunt dplyr (versie 0.5.0):

  • gegevensframes
  • gegevenstabellen
  • SQLite
  • PostgreSQL / Redshift
  • MySQL / MariaDB
  • BigQuery
  • MonetDB
  • gegevenskubussen met arrays (gedeeltelijke implementatie)

dplyr's werkwoorden met enkele tabel

dplyr introduceert een grammatica van gegevensmanipulatie in R Het biedt een consistente interface om met gegevens te werken, ongeacht waar deze zijn opgeslagen: data.frame , data.table of een database . De belangrijkste onderdelen van dplyr zijn geschreven met behulp van Rcpp , wat het zeer snel maakt voor het werken met gegevens in het geheugen.

De filosofie van dplyr is om kleine functies te hebben die één ding goed doen. De vijf eenvoudige functies ( filter , arrange , select , mutate en summarise ) kunnen worden gebruikt om nieuwe manieren te onthullen om gegevens te beschrijven. In combinatie met group_by kunnen deze functies worden gebruikt om groepsgewijze samenvattingstatistieken te berekenen.

Syntaxis-overeenkomsten

Al deze functies hebben een vergelijkbare syntaxis:

  • Het eerste argument voor al deze functies is altijd een gegevensframe
  • Kolommen kunnen direct worden doorverwezen met behulp van kale variabelenamen (dat wil zeggen, zonder $ )
  • Deze functies wijzigen de oorspronkelijke gegevens zelf niet, dwz ze hebben geen bijwerkingen. Daarom moeten de resultaten altijd in een object worden opgeslagen.

We zullen de ingebouwde mtcars- gegevensset gebruiken om de enkele dplyr dplyr te verkennen. Voordat we het type mtcars naar tbl_df (omdat het afdrukken schoner wordt), voegen we de rownames van de dataset toe als een kolom met de rownames_to_column functie uit het tibble- pakket.

library(dplyr) # This documentation was written using version 0.5.0

mtcars_tbl <- as_data_frame(tibble::rownames_to_column(mtcars, "cars"))

# examine the structure of data
head(mtcars_tbl)

# A tibble: 6 x 12
#               cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#              <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1         Mazda RX4  21.0     6   160   110  3.90 2.620 16.46     0     1     4     4
#2     Mazda RX4 Wag  21.0     6   160   110  3.90 2.875 17.02     0     1     4     4
#3        Datsun 710  22.8     4   108    93  3.85 2.320 18.61     1     1     4     1
#4    Hornet 4 Drive  21.4     6   258   110  3.08 3.215 19.44     1     0     3     1
#5 Hornet Sportabout  18.7     8   360   175  3.15 3.440 17.02     0     0     3     2
#6           Valiant  18.1     6   225   105  2.76 3.460 20.22     1     0     3     1

filter

filter helpt subsetrijen die aan bepaalde criteria voldoen. Het eerste argument is de naam van het data.frame en de tweede (en volgende) argumenten zijn de criteria die de gegevens filteren (deze criteria moeten worden geëvalueerd als TRUE of FALSE )

Subset alle auto's met 4 cilinders - cyl :

filter(mtcars_tbl, cyl == 4) 

# A tibble: 11 x 12
#             cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#            <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1      Datsun 710  22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1
#2       Merc 240D  24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2
#3        Merc 230  22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2
#4        Fiat 128  32.4     4  78.7    66  4.08 2.200 19.47     1     1     4     1
#5     Honda Civic  30.4     4  75.7    52  4.93 1.615 18.52     1     1     4     2
# ... with 6 more rows

We kunnen aan meerdere criteria voldoen, gescheiden door een komma. Om de auto's met 4 of 6 cilinders - cyl en 5 versnellingen - gear :

filter(mtcars_tbl, cyl == 4 | cyl == 6, gear == 5)

# A tibble: 3 x 12
#           cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#          <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 Porsche 914-2  26.0     4 120.3    91  4.43 2.140  16.7     0     1     5     2
#2  Lotus Europa  30.4     4  95.1   113  3.77 1.513  16.9     1     1     5     2
#3  Ferrari Dino  19.7     6 145.0   175  3.62 2.770  15.5     0     1     5     6

filter selecteert rijen op basis van criteria. Gebruik slice om rijen op positie te selecteren. slice heeft slechts 2 argumenten: de eerste is een data.frame en de tweede is een geheel getal data.frame .

Om rijen 6 tot en met 9 te selecteren:

slice(mtcars_tbl, 6:9)

# A tibble: 4 x 12
#        cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#       <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1    Valiant  18.1     6 225.0   105  2.76  3.46 20.22     1     0     3     1
#2 Duster 360  14.3     8 360.0   245  3.21  3.57 15.84     0     0     3     4
#3  Merc 240D  24.4     4 146.7    62  3.69  3.19 20.00     1     0     4     2
#4   Merc 230  22.8     4 140.8    95  3.92  3.15 22.90     1     0     4     2

Of:

slice(mtcars_tbl, -c(1:5, 10:n())) 

Dit resulteert in dezelfde uitvoer als slice(mtcars_tbl, 6:9)

n() staat voor het aantal waarnemingen in de huidige groep

regelen

arrange wordt gebruikt om de gegevens te sorteren op een opgegeven variabele (n). Net als het vorige werkwoord (en alle andere functies in dplyr ), is het eerste argument een data.frame en de daaruit voortvloeiende argumenten worden gebruikt om de gegevens te sorteren. Als er meer dan één variabele wordt doorgegeven, worden de gegevens eerst gesorteerd op de eerste variabele en vervolgens op de tweede variabele, enzovoort.

Om de gegevens per paardenkracht te bestellen - hp

arrange(mtcars_tbl, hp) 

# A tibble: 32 x 12
#             cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#            <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1     Honda Civic  30.4     4  75.7    52  4.93 1.615 18.52     1     1     4     2
#2       Merc 240D  24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2
#3  Toyota Corolla  33.9     4  71.1    65  4.22 1.835 19.90     1     1     4     1
#4        Fiat 128  32.4     4  78.7    66  4.08 2.200 19.47     1     1     4     1
#5       Fiat X1-9  27.3     4  79.0    66  4.08 1.935 18.90     1     1     4     1
#6   Porsche 914-2  26.0     4 120.3    91  4.43 2.140 16.70     0     1     5     2
# ... with 26 more rows

Om de gegevens in mijlen per gallon - mpg in aflopende volgorde te arrange , gevolgd door het aantal cilinders - cyl :

arrange(mtcars_tbl, desc(mpg), cyl)

# A tibble: 32 x 12
#             cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#            <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1  Toyota Corolla  33.9     4  71.1    65  4.22 1.835 19.90     1     1     4     1
#2        Fiat 128  32.4     4  78.7    66  4.08 2.200 19.47     1     1     4     1
#3     Honda Civic  30.4     4  75.7    52  4.93 1.615 18.52     1     1     4     2
#4    Lotus Europa  30.4     4  95.1   113  3.77 1.513 16.90     1     1     5     2
#5       Fiat X1-9  27.3     4  79.0    66  4.08 1.935 18.90     1     1     4     1
#6   Porsche 914-2  26.0     4 120.3    91  4.43 2.140 16.70     0     1     5     2
# ... with 26 more rows

kiezen

select wordt gebruikt om slechts een subset van variabelen te selecteren. Om alleen mpg , disp , wt , qsec en vs uit mtcars_tbl :

select(mtcars_tbl, mpg, disp, wt, qsec, vs)

# A tibble: 32 x 5
#     mpg  disp    wt  qsec    vs
#   <dbl> <dbl> <dbl> <dbl> <dbl>
#1   21.0 160.0 2.620 16.46     0
#2   21.0 160.0 2.875 17.02     0
#3   22.8 108.0 2.320 18.61     1
#4   21.4 258.0 3.215 19.44     1
#5   18.7 360.0 3.440 17.02     0
#6   18.1 225.0 3.460 20.22     1
# ... with 26 more rows

: notatie kan worden gebruikt om opeenvolgende kolommen te selecteren. Kolommen selecteren uit cars via disp en vs via carb :

select(mtcars_tbl, cars:disp, vs:carb)

# A tibble: 32 x 8
#                cars   mpg   cyl  disp    vs    am  gear  carb
#               <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1          Mazda RX4  21.0     6 160.0     0     1     4     4
#2      Mazda RX4 Wag  21.0     6 160.0     0     1     4     4
#3         Datsun 710  22.8     4 108.0     1     1     4     1
#4     Hornet 4 Drive  21.4     6 258.0     1     0     3     1
#5  Hornet Sportabout  18.7     8 360.0     0     0     3     2
#6            Valiant  18.1     6 225.0     1     0     3     1
# ... with 26 more rows

of select(mtcars_tbl, -(hp:qsec))

Voor gegevenssets die meerdere kolommen bevatten, kan het vervelend zijn om meerdere kolommen op naam te selecteren. Om het leven gemakkelijker te maken, zijn er een aantal starts_with() zoals starts_with() , ends_with() , contains() , matches() , num_range() , one_of() en everything() ) die kunnen worden gebruikt in select . Zie ?select_helpers en ?select voor meer informatie over het gebruik ervan.

Opmerking : Terwijl we rechtstreeks naar kolommen verwijzen in select() , gebruiken we kale kolomnamen, maar aanhalingstekens moeten worden gebruikt bij het verwijzen naar kolommen in helpfuncties.

Kolommen hernoemen tijdens het selecteren:

select(mtcars_tbl, cylinders = cyl, displacement = disp) 

# A tibble: 32 x 2
#   cylinders displacement
#       <dbl>        <dbl>
#1          6        160.0
#2          6        160.0
#3          4        108.0
#4          6        258.0
#5          8        360.0
#6          6        225.0
# ... with 26 more rows

Zoals verwacht, vallen alle andere variabelen weg.

Om kolommen hernoemen zonder te laten vallen andere variabelen, gebruik rename :

rename(mtcars_tbl, cylinders = cyl, displacement = disp)

# A tibble: 32 x 12
#                cars   mpg cylinders displacement    hp  drat    wt  qsec    vs
#               <chr> <dbl>     <dbl>        <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1          Mazda RX4  21.0         6        160.0   110  3.90 2.620 16.46     0
#2      Mazda RX4 Wag  21.0         6        160.0   110  3.90 2.875 17.02     0
#3         Datsun 710  22.8         4        108.0    93  3.85 2.320 18.61     1
#4     Hornet 4 Drive  21.4         6        258.0   110  3.08 3.215 19.44     1
#5  Hornet Sportabout  18.7         8        360.0   175  3.15 3.440 17.02     0
#6            Valiant  18.1         6        225.0   105  2.76 3.460 20.22     1
# ... with 26 more rows, and 3 more variables: am <dbl>, gear <dbl>, carb <dbl>

muteren

mutate kan worden gebruikt om nieuwe kolommen aan de gegevens toe te voegen. Net als alle andere functies in dplyr , voegt muteren de nieuw gemaakte kolommen niet toe aan de oorspronkelijke gegevens. Kolommen worden aan het einde van het data.frame .

mutate(mtcars_tbl, weight_ton = wt/2, weight_pounds = weight_ton * 2000)

# A tibble: 32 x 14
#                cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb weight_ton weight_pounds
#               <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>      <dbl>         <dbl>
#1          Mazda RX4  21.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4     1.3100          2620
#2      Mazda RX4 Wag  21.0     6 160.0   110  3.90 2.875 17.02     0     1     4     4     1.4375          2875
#3         Datsun 710  22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1     1.1600          2320
#4     Hornet 4 Drive  21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1     1.6075          3215
#5  Hornet Sportabout  18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2     1.7200          3440
#6            Valiant  18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1     1.7300          3460
# ... with 26 more rows

Let op het gebruik van weight_ton bij het maken van weight_pounds . In tegenstelling tot base R kunnen we met mutate verwijzen naar kolommen die we zojuist hebben gemaakt om te worden gebruikt voor een volgende bewerking.

Gebruik transmute plaats van mutate om alleen de nieuw gemaakte kolommen te behouden:

transmute(mtcars_tbl, weight_ton = wt/2, weight_pounds = weight_ton * 2000)

# A tibble: 32 x 2
#   weight_ton weight_pounds
#        <dbl>         <dbl>
#1      1.3100          2620
#2      1.4375          2875
#3      1.1600          2320
#4      1.6075          3215
#5      1.7200          3440
#6      1.7300          3460
# ... with 26 more rows

samenvatten

summarise berekent samenvattende statistieken van variabelen door meerdere waarden samen te vouwen tot een enkele waarde. Het kan meerdere statistieken berekenen en we kunnen deze samenvattingskolommen een naam geven in dezelfde verklaring.

Om het gemiddelde en de standaarddeviatie van mpg en disp van alle auto's in de dataset te berekenen:

summarise(mtcars_tbl, mean_mpg = mean(mpg), sd_mpg = sd(mpg), 
          mean_disp = mean(disp), sd_disp = sd(disp))

# A tibble: 1 x 4
#  mean_mpg   sd_mpg mean_disp  sd_disp
#     <dbl>    <dbl>     <dbl>    <dbl>
#1 20.09062 6.026948  230.7219 123.9387

group_by

group_by kan worden gebruikt om group_by bewerkingen op gegevens uit te voeren. Wanneer de hierboven gedefinieerde werkwoorden op deze gegroepeerde gegevens worden toegepast, worden ze automatisch op elke groep afzonderlijk toegepast.

mean en sd van mpg door cyl :

by_cyl <- group_by(mtcars_tbl, cyl)
summarise(by_cyl, mean_mpg = mean(mpg), sd_mpg = sd(mpg))


# A tibble: 3 x 3
#    cyl mean_mpg   sd_mpg
#  <dbl>    <dbl>    <dbl>
#1     4 26.66364 4.509828
#2     6 19.74286 1.453567
#3     8 15.10000 2.560048

Alles samenbrengen

We selecteren kolommen van cars via hp en gear , orden de rijen op cyl en van hoogste naar laagste mpg , groeperen de gegevens op gear en subset alleen die auto's hebben mpg > 20 en hp > 75

selected <- select(mtcars_tbl, cars:hp, gear)
ordered <- arrange(selected, cyl, desc(mpg))
by_cyl <- group_by(ordered, gear)
filter(by_cyl, mpg > 20, hp > 75)

Source: local data frame [9 x 6]
Groups: gear [3]

#            cars   mpg   cyl  disp    hp  gear
#           <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
#1   Lotus Europa  30.4     4  95.1   113     5
#2  Porsche 914-2  26.0     4 120.3    91     5
#3     Datsun 710  22.8     4 108.0    93     4
#4       Merc 230  22.8     4 140.8    95     4
#5  Toyota Corona  21.5     4 120.1    97     3
# ... with 4 more rows

Misschien zijn we niet geïnteresseerd in de tussenresultaten, we kunnen hetzelfde resultaat bereiken als hierboven door de functieaanroepen in te pakken:

filter(
    group_by(
        arrange(
            select(
                mtcars_tbl, cars:hp
            ), cyl, desc(mpg)
        ), cyl   
    ),mpg > 20, hp > 75 
)

Dit kan een beetje moeilijk te lezen zijn. Dus dplyr bewerkingen kunnen worden gekoppeld met behulp van de pipe %>% operator. De bovenstaande code vertaalt zich naar:

mtcars_tbl %>% 
    select(cars:hp) %>% 
    arrange(cyl, desc(mpg)) %>%
    group_by(cyl) %>% 
    filter(mpg > 20, hp > 75) 

vat meerdere kolommen samen

dplyr biedt dplyr summarise_all() om functies toe te passen op alle (niet-groeperende) kolommen.

Om het aantal afzonderlijke waarden voor elke kolom te vinden:

mtcars_tbl %>% 
    summarise_all(n_distinct)

# A tibble: 1 x 12
#   cars   mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1    32    25     3    27    22    22    29    30     2     2     3     6

Om het aantal afzonderlijke waarden voor elke kolom per cyl :

mtcars_tbl %>% 
    group_by(cyl) %>% 
    summarise_all(n_distinct)

# A tibble: 3 x 12
#    cyl  cars   mpg  disp    hp  drat    wt  qsec    vs    am  gear  carb
#  <dbl> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int> <int>
#1     4    11     9    11    10    10    11    11     2     2     3     2
#2     6     7     6     5     4     5     6     7     2     2     3     3
#3     8    14    12    11     9    11    13    14     1     2     2     4

Merk op dat we zojuist de instructie group_by moesten toevoegen en de rest van de code is hetzelfde. De output bestaat nu uit drie rijen - één voor elke unieke waarde van cyl .

Om summarise specifieke meerdere kolommen, gebruik summarise_at

mtcars_tbl %>% 
    group_by(cyl) %>% 
    summarise_at(c("mpg", "disp", "hp"), mean)

# A tibble: 3 x 4
#    cyl      mpg     disp        hp
#  <dbl>    <dbl>    <dbl>     <dbl>
#1     4 26.66364 105.1364  82.63636
#2     6 19.74286 183.3143 122.28571
#3     8 15.10000 353.1000 209.21429

helper functies ( ?select_helpers ) kan worden gebruikt in de plaats van kolomnamen om specifieke kolommen te selecteren

Als u meerdere functies wilt toepassen, geeft u de functienamen door als een tekenvector:

mtcars_tbl %>% 
    group_by(cyl) %>% 
    summarise_at(c("mpg", "disp", "hp"), 
                 c("mean", "sd"))

of wikkel ze in funs :

mtcars_tbl %>% 
    group_by(cyl) %>% 
    summarise_at(c("mpg", "disp", "hp"), 
                 funs(mean, sd))

# A tibble: 3 x 7
#    cyl mpg_mean disp_mean   hp_mean   mpg_sd  disp_sd    hp_sd
#  <dbl>    <dbl>     <dbl>     <dbl>    <dbl>    <dbl>    <dbl>
#1     4 26.66364  105.1364  82.63636 4.509828 26.87159 20.93453
#2     6 19.74286  183.3143 122.28571 1.453567 41.56246 24.26049
#3     8 15.10000  353.1000 209.21429 2.560048 67.77132 50.97689

Kolomnamen worden nu toegevoegd met functienamen om ze verschillend te houden. Om dit te wijzigen, geeft u de naam die moet worden toegevoegd met de functie:

mtcars_tbl %>% 
    group_by(cyl) %>% 
    summarise_at(c("mpg", "disp", "hp"), 
                 c(Mean = "mean", SD = "sd"))

mtcars_tbl %>% 
    group_by(cyl) %>% 
    summarise_at(c("mpg", "disp", "hp"), 
                 funs(Mean = mean, SD = sd))


# A tibble: 3 x 7
#    cyl mpg_Mean disp_Mean   hp_Mean   mpg_SD  disp_SD    hp_SD
#  <dbl>    <dbl>     <dbl>     <dbl>    <dbl>    <dbl>    <dbl>
#1     4 26.66364  105.1364  82.63636 4.509828 26.87159 20.93453
#2     6 19.74286  183.3143 122.28571 1.453567 41.56246 24.26049
#3     8 15.10000  353.1000 209.21429 2.560048 67.77132 50.97689

Gebruik summarise_if u voorwaardelijk kolommen wilt selecteren:

Neem het mean van alle kolommen die numeric gegroepeerd per cyl :

mtcars_tbl %>% 
    group_by(cyl) %>% 
    summarise_if(is.numeric, mean) 

# A tibble: 3 x 11
#    cyl      mpg     disp        hp     drat       wt     qsec
#  <dbl>    <dbl>    <dbl>     <dbl>    <dbl>    <dbl>    <dbl>
#1     4 26.66364 105.1364  82.63636 4.070909 2.285727 19.13727
#2     6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714
#3     8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214
# ... with 4 more variables: vs <dbl>, am <dbl>, gear <dbl>,
#   carb <dbl>

Sommige variabelen zijn echter discreet en het mean van deze variabelen heeft geen zin.

Om het mean te nemen van alleen continue variabelen per cyl :

mtcars_tbl %>% 
    group_by(cyl) %>% 
    summarise_if(function(x) is.numeric(x) & n_distinct(x) > 6, mean)

# A tibble: 3 x 7
#    cyl      mpg     disp        hp     drat       wt     qsec
#  <dbl>    <dbl>    <dbl>     <dbl>    <dbl>    <dbl>    <dbl>
#1     4 26.66364 105.1364  82.63636 4.070909 2.285727 19.13727
#2     6 19.74286 183.3143 122.28571 3.585714 3.117143 17.97714
#3     8 15.10000 353.1000 209.21429 3.229286 3.999214 16.77214

Subset-observatie (rijen)

dplyr::filter() - Selecteer een subset van rijen in een gegevensframe die aan logische criteria voldoen:

dplyr::filter(iris,Sepal.Length>7)
#       Sepal.Length Sepal.Width Petal.Length Petal.Width   Species
#    1           7.1         3.0          5.9         2.1 virginica
#    2           7.6         3.0          6.6         2.1 virginica
#    3           7.3         2.9          6.3         1.8 virginica
#    4           7.2         3.6          6.1         2.5 virginica
#    5           7.7         3.8          6.7         2.2 virginica
#    6           7.7         2.6          6.9         2.3 virginica
#    7           7.7         2.8          6.7         2.0 virginica
#    8           7.2         3.2          6.0         1.8 virginica
#    9           7.2         3.0          5.8         1.6 virginica
#    10          7.4         2.8          6.1         1.9 virginica
#    11          7.9         3.8          6.4         2.0 virginica
#    12          7.7         3.0          6.1         2.3 virginica

dplyr::distinct() - Verwijder dubbele rijen:

distinct(iris, Sepal.Length, .keep_all = TRUE)
#       Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
#    1           5.1         3.5          1.4         0.2     setosa
#    2           4.9         3.0          1.4         0.2     setosa
#    3           4.7         3.2          1.3         0.2     setosa
#    4           4.6         3.1          1.5         0.2     setosa
#    5           5.0         3.6          1.4         0.2     setosa
#    6           5.4         3.9          1.7         0.4     setosa
#    7           4.4         2.9          1.4         0.2     setosa
#    8           4.8         3.4          1.6         0.2     setosa
#    9           4.3         3.0          1.1         0.1     setosa
#   10          5.8         4.0          1.2         0.2     setosa
#   11          5.7         4.4          1.5         0.4     setosa
#   12          5.2         3.5          1.5         0.2     setosa
#   13          5.5         4.2          1.4         0.2     setosa
#   14          4.5         2.3          1.3         0.3     setosa
#   15          5.3         3.7          1.5         0.2     setosa
#   16          7.0         3.2          4.7         1.4 versicolor
#   17          6.4         3.2          4.5         1.5 versicolor
#   18          6.9         3.1          4.9         1.5 versicolor
#   19          6.5         2.8          4.6         1.5 versicolor
#   20          6.3         3.3          4.7         1.6 versicolor
#   21          6.6         2.9          4.6         1.3 versicolor
#   22          5.9         3.0          4.2         1.5 versicolor
#   23          6.0         2.2          4.0         1.0 versicolor
#   24          6.1         2.9          4.7         1.4 versicolor
#   25          5.6         2.9          3.6         1.3 versicolor
#   26          6.7         3.1          4.4         1.4 versicolor
#   27          6.2         2.2          4.5         1.5 versicolor
#   28          6.8         2.8          4.8         1.4 versicolor
#   29          7.1         3.0          5.9         2.1  virginica
#   30          7.6         3.0          6.6         2.1  virginica
#   31          7.3         2.9          6.3         1.8  virginica
#   32          7.2         3.6          6.1         2.5  virginica
#   33          7.7         3.8          6.7         2.2  virginica
#   34          7.4         2.8          6.1         1.9  virginica
#   35          7.9         3.8          6.4         2.0  virginica

Aggregeren met%>% (pijp) operator

De buis (%>%) operator kan worden gebruikt in combinatie met dplyr functies. In dit voorbeeld gebruiken we de mtcars gegevensset (zie help("mtcars") voor meer informatie) om te laten zien hoe een gegevensframe kan worden samengevat en om variabelen aan de gegevens toe te voegen met het resultaat van de toepassing van een functie.

library(dplyr)
library(magrittr)
df <- mtcars
df$cars <- rownames(df) #just add the cars names to the df
df <- df[,c(ncol(df),1:(ncol(df)-1))] # and place the names in the first column

1. Vat de gegevens samen

Om statistieken te berekenen gebruiken we een summarize en de juiste functies. In dit geval wordt n() gebruikt om het aantal gevallen te tellen.

 df %>%
  summarize(count=n(),mean_mpg = mean(mpg, na.rm = TRUE),
            min_weight = min(wt),max_weight = max(wt))

#  count mean_mpg min_weight max_weight
#1    32 20.09062      1.513      5.424

2. Statistieken berekenen per groep

Het is mogelijk om de statistieken te berekenen op basis van groepen gegevens. In dit geval op Aantal cilinders en Aantal versnellingen vooruit

df %>%
  group_by(cyl, gear) %>%
  summarize(count=n(),mean_mpg = mean(mpg, na.rm = TRUE),
            min_weight = min(wt),max_weight = max(wt))

# Source: local data frame [8 x 6]
# Groups: cyl [?]
#
#    cyl  gear count mean_mpg min_weight max_weight
#  <dbl> <dbl> <int>    <dbl>      <dbl>      <dbl>
#1     4     3     1   21.500      2.465      2.465
#2     4     4     8   26.925      1.615      3.190
#3     4     5     2   28.200      1.513      2.140
#4     6     3     2   19.750      3.215      3.460
#5     6     4     4   19.750      2.620      3.440
#6     6     5     1   19.700      2.770      2.770
#7     8     3    12   15.050      3.435      5.424
#8     8     5     2   15.400      3.170      3.570

Voorbeelden van NSE en stringvariabelen in dpylr

dplyr gebruikt Non-Standard Evaluation (NSE), daarom kunnen we de variabelenamen normaal gesproken zonder aanhalingstekens gebruiken. Soms moeten we echter tijdens de gegevenspijplijn onze variabelenamen ophalen uit andere bronnen, zoals een Shiny-selectievak. In het geval van functies zoals select , kunnen we select_ gebruiken om een select_ te gebruiken om te selecteren

variable1 <- "Sepal.Length"
variable2 <- "Sepal.Width"
iris %>%
select_(variable1, variable2) %>%
head(n=5)
#  Sepal.Length Sepal.Width
#  1          5.1         3.5
#  2          4.9         3.0
#  3          4.7         3.2
#  4          4.6         3.1
#  5          5.0         3.6

Maar als we willen andere functies, zoals een samenvatting of filter te gebruiken moeten we gebruiken interp functie van lazyeval pakket

variable1 <- "Sepal.Length"
variable2 <- "Sepal.Width"
variable3 <- "Species"
iris %>%
select_(variable1, variable2, variable3) %>%
group_by_(variable3) %>%
summarize_(mean1 = lazyeval::interp(~mean(var), var = as.name(variable1)), mean2 = lazyeval::interp(~mean(var), var = as.name(variable2)))
#      Species mean1 mean2
#       <fctr> <dbl> <dbl>
# 1     setosa 5.006 3.428
# 2 versicolor 5.936 2.770
# 3  virginica 6.588 2.974


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow