R Language
dplyr
Recherche…
Remarques
dplyr est une itération de plyr qui fournit des fonctions flexibles basées sur "ver" pour manipuler des données dans R. La dernière version de dplyr peut être téléchargée depuis CRAN en utilisant
install.package("dplyr")
L'objet clé de dplyr est un tbl, une représentation d'une structure de données tabulaire. Actuellement, dplyr (version 0.5.0) supporte:
- trames de données
- tableaux de données
- SQLite
- PostgreSQL / Redshift
- MySQL / MariaDB
- Bigquery
- MonetDB
- cubes de données avec tableaux (implémentation partielle)
Les verbes à table unique de dplyr
dplyr introduit une grammaire de manipulation de données dans R
Il fournit une interface cohérente pour travailler avec les données, peu importe où elles sont stockées: data.frame , data.table ou une database
. Les éléments clés de dplyr
sont écrits en utilisant Rcpp , ce qui le rend très rapide pour travailler avec des données en mémoire.
La philosophie de dplyr
est d'avoir de petites fonctions qui font une chose bien. Les cinq fonctions simples ( filter
, arrange
, select
, mutate
et summarise
) peuvent être utilisées pour révéler de nouvelles façons de décrire les données. Combinées avec group_by
, ces fonctions peuvent être utilisées pour calculer des statistiques récapitulatives par groupe.
Points communs de la syntaxe
Toutes ces fonctions ont une syntaxe similaire:
- Le premier argument de toutes ces fonctions est toujours un bloc de données
- Les colonnes peuvent être référées directement en utilisant des noms de variables nus (c.-à-d. Sans utiliser
$
) - Ces fonctions ne modifient pas les données d'origine elles-mêmes, c'est-à-dire qu'elles n'ont pas d'effets secondaires. Par conséquent, les résultats doivent toujours être enregistrés dans un objet.
Nous utiliserons le jeu de données intégré mtcars pour explorer les dplyr
une seule table de dplyr
. Avant de convertir le type de mtcars
à tbl_df
(car il rend plus propre d'impression), nous ajoutons les rownames
de l'ensemble de données en tant que colonne à l' aide rownames_to_column
fonction du Tibble package.
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
filtre
filter
aide les lignes de sous-ensemble correspondant à certains critères. Le premier argument est le nom du data.frame
et le second (et les suivants) sont les critères qui filtrent les données (ces critères doivent être soit TRUE
ou FALSE
).
Sous-ensemble toutes les voitures qui ont 4 cylindres - 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
Nous pouvons passer plusieurs critères séparés par une virgule. Pour sous-équiper les voitures qui ont soit 4 ou 6 cylindres - cyl
et ont 5 vitesses - 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
sélectionne les lignes en fonction des critères, pour sélectionner les lignes par position, utilisez la slice
. slice
ne prend que 2 arguments: le premier est un data.frame
et le second des valeurs de ligne entières.
Pour sélectionner les lignes 6 à 9:
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
Ou:
slice(mtcars_tbl, -c(1:5, 10:n()))
Cela donne le même résultat que slice(mtcars_tbl, 6:9)
n()
représente le nombre d'observations dans le groupe en cours
organiser
arrange
est utilisé pour trier les données selon une ou plusieurs variables spécifiées. Tout comme le verbe précédent (et toutes les autres fonctions de dplyr
), le premier argument est un data.frame
, et des arguments conséquents sont utilisés pour trier les données. Si plusieurs variables sont transmises, les données sont d'abord triées par la première variable, puis par la seconde, etc.
Pour commander les données par horsepower - 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
Pour arrange
les données en miles par gallon - mpg
en ordre décroissant, suivi du nombre de cylindres - 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
sélectionner
select
est utilisé pour sélectionner uniquement un sous-ensemble de variables. Pour sélectionner uniquement mpg
, disp
, wt
, qsec
et vs
de 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
:
notation peut être utilisée pour sélectionner des colonnes consécutives. Pour sélectionner les colonnes des cars
via disp
et 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
ou select(mtcars_tbl, -(hp:qsec))
Pour les jeux de données contenant plusieurs colonnes, il peut être fastidieux de sélectionner plusieurs colonnes par nom. Pour vous faciliter la vie, il existe un certain nombre de fonctions d'assistance (telles que starts_with()
, ends_with()
, contains()
, matches()
, num_range()
, one_of()
et everything()
) qui peuvent être utilisés dans select
. Pour en savoir plus sur leur utilisation, voir ?select_helpers
et ?select
.
Remarque : En référence aux colonnes directement dans select()
, nous utilisons des noms de colonnes nus, mais les guillemets doivent être utilisés en référence aux colonnes des fonctions d'assistance.
Pour renommer les colonnes en sélectionnant:
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
Comme prévu, toutes les autres variables sont supprimées.
Pour renommer des colonnes sans supprimer d'autres variables, utilisez 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>
subir une mutation
mutate
peut être utilisé pour ajouter de nouvelles colonnes aux données. Comme toutes les autres fonctions de dplyr
, dplyr
n'ajoute pas les colonnes nouvellement créées aux données d'origine. Les colonnes sont ajoutées à la fin du 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
Notez l'utilisation de weight_ton
lors de la création de weight_pounds
. Contrairement à la base R
, mutate
nous permet de faire référence à des colonnes que nous venons de créer pour une opération ultérieure.
Pour ne conserver que les colonnes nouvellement créées, utilisez transmute
au lieu de mutate
:
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
résumer
summarise
les statistiques récapitulatives des variables en réduisant plusieurs valeurs à une seule valeur. Il peut calculer plusieurs statistiques et nous pouvons nommer ces colonnes récapitulatives dans la même déclaration.
Pour calculer la moyenne et l' écart type de mpg
et de disp
de toutes les voitures du jeu de données:
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
par groupe
group_by
peut être utilisé pour effectuer des opérations de groupe sur des données. Lorsque les verbes définis ci-dessus sont appliqués à ces données groupées, ils sont automatiquement appliqués à chaque groupe séparément.
Pour trouver mean
et sd
de mpg
par 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
Tout mettre en place
Nous sélectionnons les colonnes des cars
par hp
et par gear
, commandons les rangées par cyl
et du plus élevé au plus bas mpg
, mpg
les données par gear
et finalement ne sous-ensemble que les voitures ayant mpg
> 20 et 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
Peut-être que nous ne sommes pas intéressés par les résultats intermédiaires, nous pouvons obtenir le même résultat que ci-dessus en encapsulant les appels de fonction:
filter(
group_by(
arrange(
select(
mtcars_tbl, cars:hp
), cyl, desc(mpg)
), cyl
),mpg > 20, hp > 75
)
Cela peut être un peu difficile à lire. Ainsi, les opérations de dplyr
peuvent être chaînées à l'aide de l'opérateur pipe %>%
. Le code ci-dessus est transféré à:
mtcars_tbl %>%
select(cars:hp) %>%
arrange(cyl, desc(mpg)) %>%
group_by(cyl) %>%
filter(mpg > 20, hp > 75)
résumer plusieurs colonnes
dplyr
fournit dplyr
summarise_all()
pour appliquer des fonctions à toutes les colonnes (non regroupées).
Pour trouver le nombre de valeurs distinctes pour chaque colonne:
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
Pour trouver le nombre de valeurs distinctes pour chaque colonne par 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
Notez que nous avons juste dû ajouter l'instruction group_by
et le reste du code est le même. La sortie comprend maintenant trois lignes - une pour chaque valeur unique de cyl
.
Pour summarise
plusieurs colonnes spécifiques, utilisez 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
fonctions d' helper
( ?select_helpers
) peuvent être utilisées à la place des noms de colonnes pour sélectionner des colonnes spécifiques
Pour appliquer plusieurs fonctions, transmettez les noms de fonctions sous la forme d'un vecteur de caractères:
mtcars_tbl %>%
group_by(cyl) %>%
summarise_at(c("mpg", "disp", "hp"),
c("mean", "sd"))
ou enveloppez-les dans des 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
Les noms de colonne sont maintenant ajoutés aux noms de fonction pour les garder distincts. Pour changer cela, passez le nom à ajouter avec la fonction:
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
Pour sélectionner des colonnes de manière conditionnelle, utilisez summarise_if
:
Prenez la mean
de toutes les colonnes numeric
regroupées par 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>
Cependant, certaines variables sont discrètes et la mean
de ces variables n'a pas de sens.
Pour ne prendre la mean
que de variables continues par 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
Observation de sous-ensemble (lignes)
dplyr::filter()
- Sélectionnez un sous-ensemble de lignes dans un dplyr::filter()
données répondant à un critère logique:
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()
- Supprime les lignes en double:
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
Agrégation avec l'opérateur%>% (pipe)
L' opérateur pipe (%>%) pourrait être utilisé en combinaison avec les fonctions dplyr
. Dans cet exemple, nous utilisons le mtcars
données mtcars
(voir help("mtcars")
pour plus d'informations) pour montrer comment sumariser un bloc de données et pour ajouter des variables aux données avec le résultat de l'application d'une fonction.
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. Sumariser les données
Pour calculer des statistiques, nous utilisons un summarize
et les fonctions appropriées. Dans ce cas, n()
est utilisé pour compter le nombre de cas.
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. Calculez les statistiques par groupe
Il est possible de calculer les statistiques par groupes de données. Dans ce cas par Nombre de cylindres et Nombre de vitesses avant
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
Exemples de variables NSE et de chaînes dans dpylr
dplyr
utilise l'évaluation non standard (NSE), c'est pourquoi nous pouvons normalement utiliser les noms de variables sans guillemets. Cependant, parfois, pendant le pipeline de données, nous devons extraire nos noms de variables d'autres sources, comme une boîte de sélection Shiny. Dans le cas de fonctions comme select
, nous pouvons simplement utiliser select_
pour utiliser une variable de chaîne pour sélectionner
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
Mais si l' on veut utiliser d' autres fonctionnalités telles que Résumer ou un filtre , nous devons utiliser interp
fonction de lazyeval
package
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