Manipulación de Datos con R (dplyr, tidyr)

Por Jose R. Zapata

Invítame a un Café

En base a las herramientas actuales para el desarrollo de proyectos y productos de Ciencia de datos y Machine Learning, se recomienda el uso de Python, sin embargo, R es una herramienta muy poderosa para el análisis de datos y la visualización de los mismos.

Puede aprender python en el curso de Ciencia de Datos con Python.

Tidyverse

El tidyverse es una colección de paquetes R diseñados para ciencia de datos. Todos los paquetes comparten una filosofía de diseño subyacente, gramática y estructuras de datos.

El libro online R for Data Science muestra todas las facultades del tydiverse en ciencia de datos.

PaqueteDescripción
dplyrManipulación de datos
tidyrOrdenar datos (data wrangling)
ggplot2Visualización de datos
readrImportar datos
purrrProgramación Funcional
tibbletibbles, una nueva forma de dataframe
stringrstrings
forcatsfactors, variable categóricas

Instalar e importar Tidyverse

install.packages("tidyverse")

library(tidyverse)

El mundo de tidyverse es:

Canonical data science workflow

Manipulacion de datos (dplyr)

Documentacion en: https://cran.r-project.org/web/packages/dplyr/dplyr.pdf

  • filter() (and slice())
  • arrange()
  • select() (and rename())
  • distinct()
  • mutate() (and transmute())
  • summarise()
  • sample_n() and sample_frac()

Instalacion de dplyr

# si ya esta instalado el tydiverse no es necesario instalarla
# Instalacion en R
#install.packages('dplyr')
# Llamar la libreria
library(dplyr)
Attaching package: ‘dplyr’


The following objects are masked from ‘package:stats’:

    filter, lag


The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union

Datos de ejemplo

# se puede descargar la base de datos nycflights13
# si ya esta instalado no hay necesidad de instalarlo nuevamente
install.packages('nycflights13',repos = 'http://cran.us.r-project.org')
Installing package into ‘/usr/local/lib/R/site-library’
(as ‘lib’ is unspecified)
library(nycflights13)
summary(flights)
      year          month             day           dep_time    sched_dep_time
 Min.   :2013   Min.   : 1.000   Min.   : 1.00   Min.   :   1   Min.   : 106
 1st Qu.:2013   1st Qu.: 4.000   1st Qu.: 8.00   1st Qu.: 907   1st Qu.: 906
 Median :2013   Median : 7.000   Median :16.00   Median :1401   Median :1359
 Mean   :2013   Mean   : 6.549   Mean   :15.71   Mean   :1349   Mean   :1344
 3rd Qu.:2013   3rd Qu.:10.000   3rd Qu.:23.00   3rd Qu.:1744   3rd Qu.:1729
 Max.   :2013   Max.   :12.000   Max.   :31.00   Max.   :2400   Max.   :2359
                                                 NA's   :8255
   dep_delay          arr_time    sched_arr_time   arr_delay
 Min.   : -43.00   Min.   :   1   Min.   :   1   Min.   : -86.000
 1st Qu.:  -5.00   1st Qu.:1104   1st Qu.:1124   1st Qu.: -17.000
 Median :  -2.00   Median :1535   Median :1556   Median :  -5.000
 Mean   :  12.64   Mean   :1502   Mean   :1536   Mean   :   6.895
 3rd Qu.:  11.00   3rd Qu.:1940   3rd Qu.:1945   3rd Qu.:  14.000
 Max.   :1301.00   Max.   :2400   Max.   :2359   Max.   :1272.000
 NA's   :8255      NA's   :8713                  NA's   :9430
   carrier              flight       tailnum             origin
 Length:336776      Min.   :   1   Length:336776      Length:336776
 Class :character   1st Qu.: 553   Class :character   Class :character
 Mode  :character   Median :1496   Mode  :character   Mode  :character
                    Mean   :1972
                    3rd Qu.:3465
                    Max.   :8500

     dest              air_time        distance         hour
 Length:336776      Min.   : 20.0   Min.   :  17   Min.   : 1.00
 Class :character   1st Qu.: 82.0   1st Qu.: 502   1st Qu.: 9.00
 Mode  :character   Median :129.0   Median : 872   Median :13.00
                    Mean   :150.7   Mean   :1040   Mean   :13.18
                    3rd Qu.:192.0   3rd Qu.:1389   3rd Qu.:17.00
                    Max.   :695.0   Max.   :4983   Max.   :23.00
                    NA's   :9430
     minute        time_hour
 Min.   : 0.00   Min.   :2013-01-01 05:00:00.00
 1st Qu.: 8.00   1st Qu.:2013-04-04 13:00:00.00
 Median :29.00   Median :2013-07-03 10:00:00.00
 Mean   :26.23   Mean   :2013-07-03 05:22:54.64
 3rd Qu.:44.00   3rd Qu.:2013-10-01 07:00:00.00
 Max.   :59.00   Max.   :2013-12-31 23:00:00.00
# Observe que el dataframe es muy largo
dim(flights)
  1. 336776
  2. 19

filter()

Permite seleccionar un subconjunto de filas en un dataframe. El primer argumento es el nombre. El segundo y siguientes argumentos son las expresiones que filtran el dataframe: por ejemplo, podemos seleccionar todos los vuelos del 3 de noviembre que fueron de American Airlines (AA) con:

head(filter(flights,month==11,day==3,carrier=='AA'))
A tibble: 6 × 19
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delaycarrierflighttailnumorigindestair_timedistancehourminutetime_hour
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm>
2013113538545-7824855-31AA2243N5DWAAJFKMIA14410895452013-11-03 05:00:00
2013113556600-4900905-5AA1175N3CSAALGAMIA1481096602013-11-03 06:00:00
2013113604610-6844855-11AA1103N3KDAALGADFW19213896102013-11-03 06:00:00
2013113624629-5907929-22AA1205N3EJAAEWRMIA14110856292013-11-03 06:00:00
2013113625630-5736805-29AA303N4WJAALGAORD1137336302013-11-03 06:00:00
2013113653655-29259205AA1263N634AAJFKLAS30622486552013-11-03 06:00:00

Es mucho mas simple que de la forma normal de R

head(flights[flights$month == 11 & flights$day == 3 & flights$carrier == 'AA', ])
A tibble: 6 × 19
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delaycarrierflighttailnumorigindestair_timedistancehourminutetime_hour
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm>
2013113538545-7824855-31AA2243N5DWAAJFKMIA14410895452013-11-03 05:00:00
2013113556600-4900905-5AA1175N3CSAALGAMIA1481096602013-11-03 06:00:00
2013113604610-6844855-11AA1103N3KDAALGADFW19213896102013-11-03 06:00:00
2013113624629-5907929-22AA1205N3EJAAEWRMIA14110856292013-11-03 06:00:00
2013113625630-5736805-29AA303N4WJAALGAORD1137336302013-11-03 06:00:00
2013113653655-29259205AA1263N634AAJFKLAS30622486552013-11-03 06:00:00

slice()

slice(flights, 1:4)
A tibble: 4 × 19
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delaycarrierflighttailnumorigindestair_timedistancehourminutetime_hour
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm>
201311517515283081911UA1545N14228EWRIAH22714005152013-01-01 05:00:00
201311533529485083020UA1714N24211LGAIAH22714165292013-01-01 05:00:00
201311542540292385033AA1141N619AAJFKMIA16010895402013-01-01 05:00:00
201311544545-110041022-18B6725N804JBJFKBQN18315765452013-01-01 05:00:00

arrange()

Funciona de manera similar a filter() excepto que en lugar de filtrar o seleccionar filas, las reordena. Se necesita un dataframe y un conjunto de nombres de columna (o expresiones más complicadas) para ordenar. Si proporciona más de un nombre de columna, cada columna adicional se utilizará para romper relaciones de los valores de las columnas anteriores:

head(arrange(flights,year,month,day,air_time))
A tibble: 6 × 19
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delaycarrierflighttailnumorigindestair_timedistancehourminutetime_hour
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm>
20131123022200622342225349EV4276N13903EWRBDL241162202013-01-01 22:00:00
20131113181322-413581416-18EV4106N19554EWRBDL2511613222013-01-01 13:00:00
20131121162110622022212-10EV4404N15912EWRPVD2816021102013-01-01 21:00:00
20131120002000020542110-169E3664N836AYJFKPHL30942002013-01-01 20:00:00
20131120562004522156211244EV4170N12540EWRALB311432042013-01-01 20:00:00
201311908915-710041033-29US1467N959UWLGAPHL32969152013-01-01 09:00:00

Se puede agregar desc() para ordenarlas en orden descendente

head(arrange(flights,desc(dep_delay)))
A tibble: 6 × 19
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delaycarrierflighttailnumorigindestair_timedistancehourminutetime_hour
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm>
2013196419001301124215301272HA51N384HAJFKHNL6404983902013-01-09 09:00:00
2013615143219351137160721201127MQ3535N504MQJFKCMH7448319352013-06-15 19:00:00
2013110112116351126123918101109MQ3695N517MQEWRORD11171916352013-01-10 16:00:00
2013920113918451014145722101007AA177N338AAJFKSFO354258618452013-09-20 18:00:00
20137228451600100510441815989MQ3075N665MQJFKCVG965891602013-07-22 16:00:00
20134101100190096013422211931DL2391N959DLJFKTPA13910051902013-04-10 19:00:00

select()

Cuando se tiene grandes conjuntos de datos con muchas columnas, pero solo unos pocos se necesitan. select() permite crear rápidamente un subconjunto útil utilizando operaciones que generalmente solo funcionan en posiciones de variables numéricas:

head(select(flights,carrier))
A tibble: 6 × 1
carrier
<chr>
UA
UA
AA
B6
DL
UA

rename()

Para renombrar las columnas, Esta no es una operacion “in-place”

head(rename(flights,airline_car = carrier))
A tibble: 6 × 19
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delayairline_carflighttailnumorigindestair_timedistancehourminutetime_hour
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm>
201311517515283081911UA1545N14228EWRIAH22714005152013-01-01 05:00:00
201311533529485083020UA1714N24211LGAIAH22714165292013-01-01 05:00:00
201311542540292385033AA1141N619AAJFKMIA16010895402013-01-01 05:00:00
201311544545-110041022-18B6725N804JBJFKBQN18315765452013-01-01 05:00:00
201311554600-6812837-25DL461N668DNLGAATL116762602013-01-01 06:00:00
201311554558-474072812UA1696N39463EWRORD1507195582013-01-01 05:00:00

distinct()

Un uso común de select() es encontrar los valores de un conjunto de variables. Esto es particularmente útil junto con el verbo distinct() que solo devuelve los valores únicos en una tabla.

distinct(select(flights,carrier))
A tibble: 16 × 1
carrier
<chr>
UA
AA
B6
DL
EV
MQ
US
WN
VX
FL
AS
9E
F9
HA
YV
OO

mutate()

Además de seleccionar conjuntos de columnas existentes, a menudo es útil agregar nuevas columnas que son funciones de columnas existentes. Este es el trabajo de mutate():

head(mutate(flights, new_col = arr_delay-dep_delay))
A tibble: 6 × 20
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delaycarrierflighttailnumorigindestair_timedistancehourminutetime_hournew_col
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm><dbl>
201311517515283081911UA1545N14228EWRIAH22714005152013-01-01 05:00:009
201311533529485083020UA1714N24211LGAIAH22714165292013-01-01 05:00:0016
201311542540292385033AA1141N619AAJFKMIA16010895402013-01-01 05:00:0031
201311544545-110041022-18B6725N804JBJFKBQN18315765452013-01-01 05:00:00-17
201311554600-6812837-25DL461N668DNLGAATL116762602013-01-01 06:00:00-19
201311554558-474072812UA1696N39463EWRORD1507195582013-01-01 05:00:0016

transmutate()

Use transmute() si solo quieres las nuevas columnas:

head(transmute(flights, new_col = arr_delay-dep_delay))
A tibble: 6 × 1
new_col
<dbl>
9
16
31
-17
-19
16

summarize()

Puede usar summarize() para contraer rápidamente dataframes en filas individuales utilizando funciones que agregan resultados. Recuerde usar na.rm = TRUE para eliminar los valores de NA.

summarise(flights,avg_air_time=mean(air_time,na.rm=TRUE))
A tibble: 1 × 1
avg_air_time
<dbl>
150.6865

sample_n() y sample_frac()

Sirven para tomar una muestra aleatoria de filas: use sample_n() para un número fijo y sample_frac() para una fracción fija.

sample_n(flights,5)
A tibble: 5 × 19
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delaycarrierflighttailnumorigindestair_timedistancehourminutetime_hour
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm>
2013512161515552017241726-2UA1492N37468EWRORD10671915552013-05-12 15:00:00
201342614301435-515531611-18UA1136N77295EWRCLE6540414352013-04-26 14:00:00
201356144214402174417404UA224N402UAEWRMIA158108514402013-05-06 14:00:00
201361162116101117331750-179E3410N919XJJFKBOS3918716102013-06-01 16:00:00
2013821740173552059203029AA145N3DRAAJFKSAN330244617352013-08-02 17:00:00
# .002% de los datos
sample_frac(flights,0.00002) # USE replace=TRUE para el muestreo de inicio
A tibble: 7 × 19
yearmonthdaydep_timesched_dep_timedep_delayarr_timesched_arr_timearr_delaycarrierflighttailnumorigindestair_timedistancehourminutetime_hour
<int><int><int><int><int><dbl><int><int><dbl><chr><int><chr><chr><chr><dbl><dbl><dbl><dbl><dttm>
20138310511055-412301235-5MQ3466N735MQLGARDU6443110552013-08-03 10:00:00
2013112516331635-217561825-29AA343N527AALGAORD12373316352013-11-25 16:00:00
20138611071115-8131013055MQ3281N723MQLGACMH7647911152013-08-06 11:00:00
2013122716571659-218471901-14DL2076N977ATEWRDTW8648816592013-12-27 16:00:00
20131021752800-8848908-20US2138N945UWLGABOS37184802013-10-21 08:00:00
20133220052005022452330-45VX415N637VAJFKLAX31824752052013-03-02 20:00:00
2013224819825-6922945-23MQ4418N825MQJFKDCA442138252013-02-24 08:00:00

Ordenar datos o data wrangling con tidyr

tidyr, que es un paquete complementario que ayuda a crear conjuntos de datos ordenados. La información ordenada es cuando tenemos un conjunto de datos donde cada fila es una observación y cada columna es una variable, de esta manera los datos están organizados de tal manera que cada celda es un valor para una variable específica de una observación específica. Tener los datos en este formato le ayudará a comprenderlos y permitirá analizarlos o visualizarlos de manera rápida y eficiente.

tidyr cheatsheet

Instalar tidyr

# si ya esta instalado tidyverse no es necesario
#install.packages('tidyr',repos = 'http://cran.us.r-project.org')
library(tidyr)
library(data.table)
Attaching package: ‘data.table’


The following objects are masked from ‘package:dplyr’:

    between, first, last

Data.frames vs data.tables

Todos los datatables también son data.frames. En términos generales, puede pensar en data.tables como data.frames con características adicionales. data.frame es parte de la base R. data.table es un paquete que amplía data.frames. Dos de sus características más notables son la velocidad y la sintaxis más limpia. Sin embargo, esa sintaxis para un data.table es diferente de la sintaxis R estándar para data.frame, mientras que para el ojo no entrenado es difícil distinguirlo de un vistazo. Por lo tanto, si lee un fragmento de código y no hay otro contexto para indicar que está trabajando con data.tables e intenta aplicar el código a un data.frame, puede fallar o producir resultados inesperados. Entonces, ¿cuáles son algunas de las diferencias prácticas? Éstos son algunos:

  • operaciones mucho más rápidas y muy intuitivas.
  • No imprimirá accidentalmente un gran data.frame con la necesidad de presionar Ctrl-C, data.table previene este tipo de accidente

Usar tidyr

  • gather()
  • spread()
  • separate()
  • unite()

Datos de ejemplo

Datos de ejemplo para ser limpiados usando tidyr

comp <- c(1,1,1,2,2,2,3,3,3)
yr <- c(1998,1999,2000,1998,1999,2000,1998,1999,2000)
q1 <- runif(9, min=0, max=100)
q2 <- runif(9, min=0, max=100)
q3 <- runif(9, min=0, max=100)
q4 <- runif(9, min=0, max=100)

df <- data.frame(comp=comp,year=yr,Qtr1 = q1,Qtr2 = q2,Qtr3 = q3,Qtr4 = q4)
df
A data.frame: 9 × 6
compyearQtr1Qtr2Qtr3Qtr4
<dbl><dbl><dbl><dbl><dbl><dbl>
1199833.92301320.7909576.658070336.900506
1199966.14533386.4518739.130666255.764761
1200062.35426255.8061418.132581682.780112
2199881.84584690.9761970.268915263.980738
2199993.78038492.027190.961707875.756686
220002.08471567.2532841.530924844.093997
3199899.42087338.0665017.23607174.275985
3199952.78655059.9256158.936649771.895343
3200087.18459589.6692481.866642348.470458

gather()

Son operaciones analogas a las pivot tables. La función gather() colapsará múltiples columnas en valores de par de claves. El data.frame anterior se considera amplio ya que la variable de tiempo (representada como trimestres) está estructurada de manera que cada trimestre representa una variable. Para reestructurar el componente de tiempo como una variable individual, podemos reunir cada trimestre dentro de una variable de columna y también reunir los valores asociados con cada trimestre en una segunda variable de columna.

# Usando solo la funcion
a<- gather(df,Quarter,Revenue,Qtr1:Qtr4)
head(a)
A data.frame: 6 × 4
compyearQuarterRevenue
<dbl><dbl><chr><dbl>
111998Qtr133.923013
211999Qtr166.145333
312000Qtr162.354262
421998Qtr181.845846
521999Qtr193.780384
622000Qtr12.084715

spread()

Es el complemento de gather()

spread(a,Quarter,Revenue)
A data.frame: 9 × 6
compyearQtr1Qtr2Qtr3Qtr4
<dbl><dbl><dbl><dbl><dbl><dbl>
1199833.92301320.7909576.658070336.900506
1199966.14533386.4518739.130666255.764761
1200062.35426255.8061418.132581682.780112
2199881.84584690.9761970.268915263.980738
2199993.78038492.027190.961707875.756686
220002.08471567.2532841.530924844.093997
3199899.42087338.0665017.23607174.275985
3199952.78655059.9256158.936649771.895343
3200087.18459589.6692481.866642348.470458

separate()

Dada la expresión regular o un vector de posiciones de caracteres, separate() convierte una sola columna de caracteres en múltiples columnas.

df <- data.frame(x = c(NA, "a.x", "b.y", "c.z"))
df
A data.frame: 4 × 1
x
<chr>
NA
a.x
b.y
c.z
separate(df,x, c("ABC", "XYZ"))
A data.frame: 4 × 2
ABCXYZ
<chr><chr>
NANA
ax
by
cz

unite()

Unite es una función para pegar varias columnas en una sola.

head(mtcars)
A data.frame: 6 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Mazda RX421.061601103.902.62016.460144
Mazda RX4 Wag21.061601103.902.87517.020144
Datsun 71022.84108933.852.32018.611141
Hornet 4 Drive21.462581103.083.21519.441031
Hornet Sportabout18.783601753.153.44017.020032
Valiant18.162251052.763.46020.221031
unidos <-unite(mtcars, "vs.am", c("vs","am"),sep = '.')
head(unidos)
A data.frame: 6 × 10
mpgcyldisphpdratwtqsecvs.amgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><chr><dbl><dbl>
Mazda RX421.061601103.902.62016.460.144
Mazda RX4 Wag21.061601103.902.87517.020.144
Datsun 71022.84108933.852.32018.611.141
Hornet 4 Drive21.462581103.083.21519.441.031
Hornet Sportabout18.783601753.153.44017.020.032
Valiant18.162251052.763.46020.221.031

separate()

Separate() es el complemento de unite()

separate(unidos,vs.am, c("vs", "am"))
A data.frame: 32 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><chr><chr><dbl><dbl>
Mazda RX421.06160.01103.902.62016.460144
Mazda RX4 Wag21.06160.01103.902.87517.020144
Datsun 71022.84108.0933.852.32018.611141
Hornet 4 Drive21.46258.01103.083.21519.441031
Hornet Sportabout18.78360.01753.153.44017.020032
Valiant18.16225.01052.763.46020.221031
Duster 36014.38360.02453.213.57015.840034
Merc 240D24.44146.7623.693.19020.001042
Merc 23022.84140.8953.923.15022.901042
Merc 28019.26167.61233.923.44018.301044
Merc 280C17.86167.61233.923.44018.901044
Merc 450SE16.48275.81803.074.07017.400033
Merc 450SL17.38275.81803.073.73017.600033
Merc 450SLC15.28275.81803.073.78018.000033
Cadillac Fleetwood10.48472.02052.935.25017.980034
Lincoln Continental10.48460.02153.005.42417.820034
Chrysler Imperial14.78440.02303.235.34517.420034
Fiat 12832.4478.7664.082.20019.471141
Honda Civic30.4475.7524.931.61518.521142
Toyota Corolla33.9471.1654.221.83519.901141
Toyota Corona21.54120.1973.702.46520.011031
Dodge Challenger15.58318.01502.763.52016.870032
AMC Javelin15.28304.01503.153.43517.300032
Camaro Z2813.38350.02453.733.84015.410034
Pontiac Firebird19.28400.01753.083.84517.050032
Fiat X1-927.3479.0664.081.93518.901141
Porsche 914-226.04120.3914.432.14016.700152
Lotus Europa30.4495.11133.771.51316.901152
Ford Pantera L15.88351.02644.223.17014.500154
Ferrari Dino19.76145.01753.622.77015.500156
Maserati Bora15.08301.03353.543.57014.600158
Volvo 142E21.44121.01094.112.78018.601142

Operador pipe %>%

Si bien no es necesario que utilice el operador de pipe con dplyr o tidyr, puede ser muy útil cuando intente realizar múltiples operaciones / funciones en un conjunto de datos. El operador pipe le permitirá evitar una operación larga anidada o hacer un montón de asignaciones. En su forma más básica.

# los Datos
df <- mtcars

Usando Nesting

library(dplyr)
arrange(sample_n(filter(df,mpg>20),size=5),desc(mpg))
A data.frame: 5 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Toyota Corolla33.9471.1654.221.83519.901141
Fiat 12832.4478.7664.082.20019.471141
Honda Civic30.4475.7524.931.61518.521142
Fiat X1-927.3479.0664.081.93518.901141
Hornet 4 Drive21.46258.01103.083.21519.441031

Usando Multiples asignaciones

library(dplyr)
a <- filter(df,mpg > 20) # selecciona un subconjunto del dataframe
b <- sample_n(a,size = 5) # toma una muestra aleatoria
c <- arrange(b,desc(mpg)) #orgniza el dataframe
c
A data.frame: 5 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Lotus Europa30.4495.11133.771.51316.901152
Merc 240D24.44146.7623.693.19020.001042
Toyota Corona21.54120.1973.702.46520.011031
Hornet 4 Drive21.46258.01103.083.21519.441031
Volvo 142E21.44121.01094.112.78018.601142

Usando el Operador pipe %>%

library(dplyr)
df %>% filter(mpg > 20) %>% sample_n(size = 5) %>% arrange(desc(mpg))
A data.frame: 5 × 11
mpgcyldisphpdratwtqsecvsamgearcarb
<dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl><dbl>
Honda Civic30.4475.7524.931.61518.521142
Fiat X1-927.3479.0664.081.93518.901141
Merc 240D24.44146.7623.693.19020.001042
Volvo 142E21.44121.01094.112.78018.601142
Mazda RX4 Wag21.06160.01103.902.87517.020144

REFERENCIAS