Paquete DPLYR

Comandos de filtrado.

Filtro de única condición.

Como primera medida se usarán los datos LifecycleSavings que guarda los ahorros personales tomados de los ingresos disponibles en la decada de 1960-1970 de 50 paises.

las variables de estos datos son numéricas y respresentan:

  1. sr: Ahorro personal agregado es la proporción de ahorro con respecto a lo que gana.
  2. pop15: Porcentaje de población por debajo de los 15 años.
  3. pop75: Porcentaje de población por encima de los 75 años.
  4. dpi: Ingreso disponible real per-cápita.
  5. ddpi: Porcentaje de crecimiento del ingreso disponible per-cápita.

se selecionarán los paises con ahorros personales agregados mayores al promedio con la opción filter.

library(tidyverse)
data("LifeCycleSavings")
media=mean(LifeCycleSavings[,1]) #Promedio de porcentaje de ahorro.
AMP = filter(LifeCycleSavings, sr > media) #ahorros mayores al promedio.
head(AMP)
##               sr pop15 pop75     dpi ddpi
## Australia  11.43 29.35  2.87 2329.68 2.87
## Austria    12.07 23.32  4.41 1507.99 3.93
## Belgium    13.17 23.80  4.43 2108.47 3.82
## Brazil     12.88 42.19  0.83  728.47 4.56
## China      11.90 44.75  0.67  289.52 6.51
## Costa Rica 10.78 47.64  1.14  471.24 2.80

Filtro de múltiples condiciones.

Ahora se filtrarán los países con ahorros personales agregados mayores al promedio y con un ingreso mayor a 2500 dolares.

AMP.I2000=filter(LifeCycleSavings, sr > media,dpi> 2400)
head(AMP.I2000)
##                sr pop15 pop75     dpi ddpi
## Denmark     16.85 24.42  3.93 2496.53 3.99
## Germany     12.55 23.31  3.35 2457.12 3.44
## Luxembourg  10.35 21.80  3.73 2449.39 1.57
## Switzerland 14.13 23.49  3.73 2630.96 2.70

Filtro con el operador lógico OR.

Se filtrarán los países con ahorros personales agregados mayores al promedio o con un ingreso mayor a 2500 dolares.

AMP.o.I2000=filter(LifeCycleSavings, sr > media|dpi> 2400)
AMP.o.I2000
##                   sr pop15 pop75     dpi ddpi
## Australia      11.43 29.35  2.87 2329.68 2.87
## Austria        12.07 23.32  4.41 1507.99 3.93
## Belgium        13.17 23.80  4.43 2108.47 3.82
## Brazil         12.88 42.19  0.83  728.47 4.56
## Canada          8.79 31.72  2.85 2982.88 2.43
## China          11.90 44.75  0.67  289.52 6.51
## Costa Rica     10.78 47.64  1.14  471.24 2.80
## Denmark        16.85 24.42  3.93 2496.53 3.99
## Finland        11.24 27.84  2.37 1681.25 4.32
## France         12.64 25.06  4.70 2213.82 4.52
## Germany        12.55 23.31  3.35 2457.12 3.44
## Greece         10.67 25.62  3.10  870.85 6.28
## Ireland        11.34 31.16  4.19 1139.95 2.99
## Italy          14.28 24.52  3.48 1390.00 3.54
## Japan          21.10 27.01  1.91 1257.28 8.21
## Luxembourg     10.35 21.80  3.73 2449.39 1.57
## Malta          15.48 32.54  2.47  601.05 8.12
## Norway         10.25 25.95  3.67 2231.03 3.62
## Netherlands    14.65 24.71  3.25 1740.70 7.66
## New Zealand    10.67 32.61  3.17 1487.52 1.76
## Peru           12.70 44.19  1.28  400.06 0.67
## Philippines    12.78 46.26  1.12  152.01 2.00
## Portugal       12.49 28.96  2.85  579.51 7.48
## South Africa   11.14 31.94  2.28  651.11 2.19
## South Rhodesia 13.30 31.92  1.52  250.96 2.00
## Spain          11.77 27.74  2.87  768.79 4.35
## Sweden          6.86 21.44  4.54 3299.49 3.01
## Switzerland    14.13 23.49  3.73 2630.96 2.70
## United States   7.56 29.81  3.43 4001.89 2.45
## Zambia         18.56 45.25  0.56  138.33 5.14

Filtro por el mínimo, máximo y otros criterios numéricos.

Se filtrara el país con el ingreso más bajo.

P.I.B=filter(LifeCycleSavings, dpi == min(dpi))
P.I.B
##       sr pop15 pop75   dpi ddpi
## India  9 41.31  0.96 88.94 1.54

Filtro con valores perdidos Na´s para una columna en específico.

Como la base de datos elegida “LifeCycleSavings” no contiene valores Na´s se trabajará con la base de datos de la guía “airquality” filtrando una columna diferente a la del ejemplo.

data("airquality")
head(airquality,10) #Antes de filtrar.
##    Ozone Solar.R Wind Temp Month Day
## 1     41     190  7.4   67     5   1
## 2     36     118  8.0   72     5   2
## 3     12     149 12.6   74     5   3
## 4     18     313 11.5   62     5   4
## 5     NA      NA 14.3   56     5   5
## 6     28      NA 14.9   66     5   6
## 7     23     299  8.6   65     5   7
## 8     19      99 13.8   59     5   8
## 9      8      19 20.1   61     5   9
## 10    NA     194  8.6   69     5  10

Se remueven los valores perdidos de la radiación solar.

no.missing.Solar.R = filter(airquality, !is.na(Solar.R))
head(no.missing.Solar.R,8) #Después de filtrar.
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    23     299  8.6   65     5   7
## 6    19      99 13.8   59     5   8
## 7     8      19 20.1   61     5   9
## 8    NA     194  8.6   69     5  10

Filtrar cualquier fila con Na´s en la base de datos.

Otra forma de hacer lo anterior es filtrar por filas.

airqual.no.NA <- filter(airquality[1:10,], complete.cases(airquality[1:10,]))
airqual.no.NA
##   Ozone Solar.R Wind Temp Month Day
## 1    41     190  7.4   67     5   1
## 2    36     118  8.0   72     5   2
## 3    12     149 12.6   74     5   3
## 4    18     313 11.5   62     5   4
## 5    23     299  8.6   65     5   7
## 6    19      99 13.8   59     5   8
## 7     8      19 20.1   61     5   9

Filtros con %in%.

Con los datos “CO2” se filtrarán solo las plantas Qn1 y Qc2 con ayuda de %in%.

data("CO2") #Antes de filtrar.
CO2
##    Plant        Type  Treatment conc uptake
## 1    Qn1      Quebec nonchilled   95   16.0
## 2    Qn1      Quebec nonchilled  175   30.4
## 3    Qn1      Quebec nonchilled  250   34.8
## 4    Qn1      Quebec nonchilled  350   37.2
## 5    Qn1      Quebec nonchilled  500   35.3
## 6    Qn1      Quebec nonchilled  675   39.2
## 7    Qn1      Quebec nonchilled 1000   39.7
## 8    Qn2      Quebec nonchilled   95   13.6
## 9    Qn2      Quebec nonchilled  175   27.3
## 10   Qn2      Quebec nonchilled  250   37.1
## 11   Qn2      Quebec nonchilled  350   41.8
## 12   Qn2      Quebec nonchilled  500   40.6
## 13   Qn2      Quebec nonchilled  675   41.4
## 14   Qn2      Quebec nonchilled 1000   44.3
## 15   Qn3      Quebec nonchilled   95   16.2
## 16   Qn3      Quebec nonchilled  175   32.4
## 17   Qn3      Quebec nonchilled  250   40.3
## 18   Qn3      Quebec nonchilled  350   42.1
## 19   Qn3      Quebec nonchilled  500   42.9
## 20   Qn3      Quebec nonchilled  675   43.9
## 21   Qn3      Quebec nonchilled 1000   45.5
## 22   Qc1      Quebec    chilled   95   14.2
## 23   Qc1      Quebec    chilled  175   24.1
## 24   Qc1      Quebec    chilled  250   30.3
## 25   Qc1      Quebec    chilled  350   34.6
## 26   Qc1      Quebec    chilled  500   32.5
## 27   Qc1      Quebec    chilled  675   35.4
## 28   Qc1      Quebec    chilled 1000   38.7
## 29   Qc2      Quebec    chilled   95    9.3
## 30   Qc2      Quebec    chilled  175   27.3
## 31   Qc2      Quebec    chilled  250   35.0
## 32   Qc2      Quebec    chilled  350   38.8
## 33   Qc2      Quebec    chilled  500   38.6
## 34   Qc2      Quebec    chilled  675   37.5
## 35   Qc2      Quebec    chilled 1000   42.4
## 36   Qc3      Quebec    chilled   95   15.1
## 37   Qc3      Quebec    chilled  175   21.0
## 38   Qc3      Quebec    chilled  250   38.1
## 39   Qc3      Quebec    chilled  350   34.0
## 40   Qc3      Quebec    chilled  500   38.9
## 41   Qc3      Quebec    chilled  675   39.6
## 42   Qc3      Quebec    chilled 1000   41.4
## 43   Mn1 Mississippi nonchilled   95   10.6
## 44   Mn1 Mississippi nonchilled  175   19.2
## 45   Mn1 Mississippi nonchilled  250   26.2
## 46   Mn1 Mississippi nonchilled  350   30.0
## 47   Mn1 Mississippi nonchilled  500   30.9
## 48   Mn1 Mississippi nonchilled  675   32.4
## 49   Mn1 Mississippi nonchilled 1000   35.5
## 50   Mn2 Mississippi nonchilled   95   12.0
## 51   Mn2 Mississippi nonchilled  175   22.0
## 52   Mn2 Mississippi nonchilled  250   30.6
## 53   Mn2 Mississippi nonchilled  350   31.8
## 54   Mn2 Mississippi nonchilled  500   32.4
## 55   Mn2 Mississippi nonchilled  675   31.1
## 56   Mn2 Mississippi nonchilled 1000   31.5
## 57   Mn3 Mississippi nonchilled   95   11.3
## 58   Mn3 Mississippi nonchilled  175   19.4
## 59   Mn3 Mississippi nonchilled  250   25.8
## 60   Mn3 Mississippi nonchilled  350   27.9
## 61   Mn3 Mississippi nonchilled  500   28.5
## 62   Mn3 Mississippi nonchilled  675   28.1
## 63   Mn3 Mississippi nonchilled 1000   27.8
## 64   Mc1 Mississippi    chilled   95   10.5
## 65   Mc1 Mississippi    chilled  175   14.9
## 66   Mc1 Mississippi    chilled  250   18.1
## 67   Mc1 Mississippi    chilled  350   18.9
## 68   Mc1 Mississippi    chilled  500   19.5
## 69   Mc1 Mississippi    chilled  675   22.2
## 70   Mc1 Mississippi    chilled 1000   21.9
## 71   Mc2 Mississippi    chilled   95    7.7
## 72   Mc2 Mississippi    chilled  175   11.4
## 73   Mc2 Mississippi    chilled  250   12.3
## 74   Mc2 Mississippi    chilled  350   13.0
## 75   Mc2 Mississippi    chilled  500   12.5
## 76   Mc2 Mississippi    chilled  675   13.7
## 77   Mc2 Mississippi    chilled 1000   14.4
## 78   Mc3 Mississippi    chilled   95   10.6
## 79   Mc3 Mississippi    chilled  175   18.0
## 80   Mc3 Mississippi    chilled  250   17.9
## 81   Mc3 Mississippi    chilled  350   17.9
## 82   Mc3 Mississippi    chilled  500   17.9
## 83   Mc3 Mississippi    chilled  675   18.9
## 84   Mc3 Mississippi    chilled 1000   19.9
CO2.two.plants <- filter(CO2,Plant %in% c("Qn1", "Qc2"))
CO2.two.plants
##    Plant   Type  Treatment conc uptake
## 1    Qn1 Quebec nonchilled   95   16.0
## 2    Qn1 Quebec nonchilled  175   30.4
## 3    Qn1 Quebec nonchilled  250   34.8
## 4    Qn1 Quebec nonchilled  350   37.2
## 5    Qn1 Quebec nonchilled  500   35.3
## 6    Qn1 Quebec nonchilled  675   39.2
## 7    Qn1 Quebec nonchilled 1000   39.7
## 8    Qc2 Quebec    chilled   95    9.3
## 9    Qc2 Quebec    chilled  175   27.3
## 10   Qc2 Quebec    chilled  250   35.0
## 11   Qc2 Quebec    chilled  350   38.8
## 12   Qc2 Quebec    chilled  500   38.6
## 13   Qc2 Quebec    chilled  675   37.5
## 14   Qc2 Quebec    chilled 1000   42.4

Filtrar una variable con una condición y solo tres columnas.

Se filtrará la base de datos tomada inicialmente LifecycleSavings con una proporción de población menor de 15 años mayor al 35% y se mostrarán las tres primeras columnas.

LifeCycle.3.columns <- filter(LifeCycleSavings, pop15 > 35)[,1:3]
head(LifeCycle.3.columns)
##               sr pop15 pop75
## Bolivia     5.75 41.89  1.67
## Brazil     12.88 42.19  0.83
## Chile       0.60 39.74  1.34
## China      11.90 44.75  0.67
## Colombia    4.98 46.64  1.06
## Costa Rica 10.78 47.64  1.14

Filtrar por la frecuencia total de una categoría en todas las filas.

Se usarán los datos airqueality para este ejemplo y se filtrará la cantidad de veces que se midió el aire en cada mes.

table(airquality$Month) #antes de filtrar 
## 
##  5  6  7  8  9 
## 31 30 31 31 30
Month.frec=airquality %>% group_by(Month)%>%filter(n()>30)  #màs de 30 veces
table(Month.frec$Month) #después de filtrar
## 
##  5  7  8 
## 31 31 31

para darle una condición adicional se buscan además que el aire tenga una temperatura mayora 78 fahrenheit.

Month.frec.temp=airquality %>% group_by(Month)%>%filter(n()>30,Temp > 78) 
table(Month.frec.temp$Month)
## 
##  5  7  8 
##  2 29 24

La tabla nos indica que en el mes de mayo se tomaron 2 mediciones, en julio 29 mediciones y en agosto 24 mediciones con una temperatura mayor a 78 fahrenheit.

Filtro por nombre de columna usando “starts with”.

Se va a encontrar las columnas que empiecen con d, en la base de datos LifeCycleSavings.

names(LifeCycleSavings) #muestra el nombre de las columnas.
## [1] "sr"    "pop15" "pop75" "dpi"   "ddpi"
Life.display =  LifeCycleSavings %>% dplyr::select(starts_with("d"))
head(Life.display) 
##               dpi ddpi
## Australia 2329.68 2.87
## Austria   1507.99 3.93
## Belgium   2108.47 3.82
## Bolivia    189.13 0.22
## Brazil     728.47 4.56
## Canada    2982.88 2.43

Filtrar por filas (Filter_at).

Se utiliza filter_at para hallar el país con mayor ingreso per-cápita y crecimiento porcentual de ingresos.

new.Life <- LifeCycleSavings %>% filter_at(vars(dpi, ddpi),
 all_vars(. == max(.)))
new.Life
## [1] sr    pop15 pop75 dpi   ddpi 
## <0 rows> (or 0-length row.names)

En este caso no hay ningún país que tenga las características buscadas.

Ordenar(sort).

Se van a ordenar los los datos “presidential” de ggplot2 y se organizará el nombre en orden decreciente.

Decreciente

data("presidential")
arrange(presidential,name)
## # A tibble: 11 x 4
##    name       start      end        party     
##    <chr>      <date>     <date>     <chr>     
##  1 Bush       1989-01-20 1993-01-20 Republican
##  2 Bush       2001-01-20 2009-01-20 Republican
##  3 Carter     1977-01-20 1981-01-20 Democratic
##  4 Clinton    1993-01-20 2001-01-20 Democratic
##  5 Eisenhower 1953-01-20 1961-01-20 Republican
##  6 Ford       1974-08-09 1977-01-20 Republican
##  7 Johnson    1963-11-22 1969-01-20 Democratic
##  8 Kennedy    1961-01-20 1963-11-22 Democratic
##  9 Nixon      1969-01-20 1974-08-09 Republican
## 10 Obama      2009-01-20 2017-01-20 Democratic
## 11 Reagan     1981-01-20 1989-01-20 Republican

Ascendente

arrange(presidential,desc(name))
## # A tibble: 11 x 4
##    name       start      end        party     
##    <chr>      <date>     <date>     <chr>     
##  1 Reagan     1981-01-20 1989-01-20 Republican
##  2 Obama      2009-01-20 2017-01-20 Democratic
##  3 Nixon      1969-01-20 1974-08-09 Republican
##  4 Kennedy    1961-01-20 1963-11-22 Democratic
##  5 Johnson    1963-11-22 1969-01-20 Democratic
##  6 Ford       1974-08-09 1977-01-20 Republican
##  7 Eisenhower 1953-01-20 1961-01-20 Republican
##  8 Clinton    1993-01-20 2001-01-20 Democratic
##  9 Carter     1977-01-20 1981-01-20 Democratic
## 10 Bush       1989-01-20 1993-01-20 Republican
## 11 Bush       2001-01-20 2009-01-20 Republican

Renombrar.

Se usa la función “rename” para cambiar el nombre de las variables.

names(LifeCycleSavings)
## [1] "sr"    "pop15" "pop75" "dpi"   "ddpi"
renomb.Life=rename(LifeCycleSavings,income=dpi,ahorros=sr)
names(renomb.Life)
## [1] "ahorros" "pop15"   "pop75"   "income"  "ddpi"

Función Mutate

Con la función mutate se añadirá una columna de una variable creada, en este caso el log 10 del ingreso.

head(LifeCycleSavings) #las primeras observaciones de LifeCycleSaving
##              sr pop15 pop75     dpi ddpi
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
## Canada     8.79 31.72  2.85 2982.88 2.43
Life.con.log=mutate(LifeCycleSavings,log.sr=log10(sr))
head(Life.con.log)
##              sr pop15 pop75     dpi ddpi    log.sr
## Australia 11.43 29.35  2.87 2329.68 2.87 1.0580462
## Austria   12.07 23.32  4.41 1507.99 3.93 1.0817073
## Belgium   13.17 23.80  4.43 2108.47 3.82 1.1195858
## Bolivia    5.75 41.89  1.67  189.13 0.22 0.7596678
## Brazil    12.88 42.19  0.83  728.47 4.56 1.1099159
## Canada     8.79 31.72  2.85 2982.88 2.43 0.9439889

“mutate_all” agrega nuevos campos todos en uno.

Se agregan las variables raiz cuadrada de cada variable de los datos LifeCyckeSavings.

life.con.raiz= mutate_all(LifeCycleSavings[,1:5],funs("square root" = sqrt( . )))
names(life.con.raiz)
##  [1] "sr"                "pop15"             "pop75"            
##  [4] "dpi"               "ddpi"              "sr_square root"   
##  [7] "pop15_square root" "pop75_square root" "dpi_square root"  
## [10] "ddpi_square root"

Mutate_at

Life.con.rangos= mutate_at(LifeCycleSavings, vars(sr,pop15,pop75), 
funs(Rank = min_rank(desc(.))))
head(Life.con.rangos)
##              sr pop15 pop75     dpi ddpi sr_Rank pop15_Rank pop75_Rank
## Australia 11.43 29.35  2.87 2329.68 2.87      19         32         18
## Austria   12.07 23.32  4.41 1507.99 3.93      16         46          5
## Belgium   13.17 23.80  4.43 2108.47 3.82       9         44          4
## Bolivia    5.75 41.89  1.67  189.13 0.22      39         18         29
## Brazil    12.88 42.19  0.83  728.47 4.56      10         17         46
## Canada     8.79 31.72  2.85 2982.88 2.43      32         29         20

Mutate_if

Se crea una función que divida por diez para los datos LifeCycleSavings, para posteriormente aplicar dicha función a la base de datos solo a los datos numéricos, esta condición la aporta “mutate_if”.

divide.by.10 <- function (a.number) (a.number / 10)
nuevo.df <- LifeCycleSavings %>%
 mutate_if(is.numeric, divide.by.10)
head(nuevo.df)
##              sr pop15 pop75     dpi  ddpi
## Australia 1.143 2.935 0.287 232.968 0.287
## Austria   1.207 2.332 0.441 150.799 0.393
## Belgium   1.317 2.380 0.443 210.847 0.382
## Bolivia   0.575 4.189 0.167  18.913 0.022
## Brazil    1.288 4.219 0.083  72.847 0.456
## Canada    0.879 3.172 0.285 298.288 0.243

Cadenas duplicadoras e indicador duplicador verdadero/falso.

Se utilizarán los datos “mpg” para filtrar las variables que no contengan las letras “a” y “o” con la función filter.

data("mpg")
table(mpg$manufacturer)
## 
##       audi  chevrolet      dodge       ford      honda    hyundai       jeep 
##         18         19         37         25          9         14          8 
## land rover    lincoln    mercury     nissan    pontiac     subaru     toyota 
##          4          3          4         13          5         14         34 
## volkswagen 
##         27
mpg.no.o.or.a <- filter(mpg, !str_detect(manufacturer,
 paste(c("o","a"), collapse = "|")))
table(mpg.no.o.or.a$manufacturer)
## 
##    jeep mercury 
##       8       4

agregaremos un campo al final para ver si un valor en particular de una columna ocurre más de una vez a esto se le llama indicador duplicador.

mpg.con.dup.indica <- mutate(mpg, duplicador.indicador = 
duplicated(manufacturer))
mpg.con.dup.indica[1:6,c(1,2,3,4,12)]
## # A tibble: 6 x 5
##   manufacturer model displ  year duplicador.indicador
##   <chr>        <chr> <dbl> <int> <lgl>               
## 1 audi         a4      1.8  1999 FALSE               
## 2 audi         a4      1.8  1999 TRUE                
## 3 audi         a4      2    2008 TRUE                
## 4 audi         a4      2    2008 TRUE                
## 5 audi         a4      2.8  1999 TRUE                
## 6 audi         a4      2.8  1999 TRUE

ahora se crea el indicador duplicador de las variables manufacturer y model teniendo como prioridad manufacturer y despues model.

mpg.con.dup.indicador2 <- mutate(mpg, 
duplicate.indicator = duplicated(manufacturer, model)) %>%
 arrange(manufacturer,model)
mpg.con.dup.indicador2[1:6,c(1,2,3,4,12)]
## # A tibble: 6 x 5
##   manufacturer model displ  year duplicate.indicator
##   <chr>        <chr> <dbl> <int> <lgl>              
## 1 audi         a4      1.8  1999 FALSE              
## 2 audi         a4      1.8  1999 TRUE               
## 3 audi         a4      2    2008 TRUE               
## 4 audi         a4      2    2008 TRUE               
## 5 audi         a4      2.8  1999 TRUE               
## 6 audi         a4      2.8  1999 TRUE

En este caso para que el indicador de duplicador de ambas variables dé “Verdad” ambos indicadores duplicadores tanto de manufacturer como model deben arrojar “Verdad”.

Quitar variables usando la opción NULL

Para el dataframe que se viene manejando “LifeCycleSavings” se borrará la variable ddpi con la opción NULL.

head(LifeCycleSavings) #antes del filtro
##              sr pop15 pop75     dpi ddpi
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
## Canada     8.79 31.72  2.85 2982.88 2.43
Life.sin.ddpi <- mutate(LifeCycleSavings, ddpi = NULL)
head(Life.sin.ddpi)    #después del filtro
##              sr pop15 pop75     dpi
## Australia 11.43 29.35  2.87 2329.68
## Austria   12.07 23.32  4.41 1507.99
## Belgium   13.17 23.80  4.43 2108.47
## Bolivia    5.75 41.89  1.67  189.13
## Brazil    12.88 42.19  0.83  728.47
## Canada     8.79 31.72  2.85 2982.88

Secuencia de código a preferencia

De la variable dpi dada en dolares se añadirán dos columnas con los ingresos en pesos y en euros. Forma no recomendada:

head(mutate(LifeCycleSavings, Pesos =  dpi*3760.71, Euros = dpi*0.86))
##              sr pop15 pop75     dpi ddpi      Pesos     Euros
## Australia 11.43 29.35  2.87 2329.68 2.87  8761250.9 2003.5248
## Austria   12.07 23.32  4.41 1507.99 3.93  5671113.1 1296.8714
## Belgium   13.17 23.80  4.43 2108.47 3.82  7929344.2 1813.2842
## Bolivia    5.75 41.89  1.67  189.13 0.22   711263.1  162.6518
## Brazil    12.88 42.19  0.83  728.47 4.56  2739564.4  626.4842
## Canada     8.79 31.72  2.85 2982.88 2.43 11217746.6 2565.2768

Forma recomendada:

head(LifeCycleSavings %>%  mutate(Pesos = dpi*3760.71) %>%
 mutate(Euros = dpi*0.86))
##              sr pop15 pop75     dpi ddpi      Pesos     Euros
## Australia 11.43 29.35  2.87 2329.68 2.87  8761250.9 2003.5248
## Austria   12.07 23.32  4.41 1507.99 3.93  5671113.1 1296.8714
## Belgium   13.17 23.80  4.43 2108.47 3.82  7929344.2 1813.2842
## Bolivia    5.75 41.89  1.67  189.13 0.22   711263.1  162.6518
## Brazil    12.88 42.19  0.83  728.47 4.56  2739564.4  626.4842
## Canada     8.79 31.72  2.85 2982.88 2.43 11217746.6 2565.2768

Transmute: Guarda solamente las variables creadas.

Para este ejemplo se sumarán las variables del dataframe “LifeCycleSavings”, no porque tenga un significado si no para mostrar la función de “Trasmute”.

head(transmute(LifeCycleSavings, new.variable = sr + pop15 + pop75
                            + dpi + ddpi))
##           new.variable
## Australia      2376.20
## Austria        1551.72
## Belgium        2153.69
## Bolivia         238.66
## Brazil          788.93
## Canada         3028.67

Usar “Across” para aplicar una función en múltiples columnas.

Definimos la función que duplica un número, para luego aplicarla a el dataframe “LifeCycleSavings”.

double.it= function(x) x*2
LifeCycleSavings %>% mutate(across(where(is.numeric), double.it)) %>%
 head()
##              sr pop15 pop75     dpi ddpi
## Australia 22.86 58.70  5.74 4659.36 5.74
## Austria   24.14 46.64  8.82 3015.98 7.86
## Belgium   26.34 47.60  8.86 4216.94 7.64
## Bolivia   11.50 83.78  3.34  378.26 0.44
## Brazil    25.76 84.38  1.66 1456.94 9.12
## Canada    17.58 63.44  5.70 5965.76 4.86

Conditional Mutating Usando case_when.

Se creará una columna en el dataframe “LifeCycleSavings” que posteriormente sera cambiada con el condicional “case_when”.

con.Colum.Life= mutate(LifeCycleSavings,colum.que.sera.cambiada= sqrt(LifeCycleSavings$dpi)) 
head((con.Colum.Life))
##              sr pop15 pop75     dpi ddpi colum.que.sera.cambiada
## Australia 11.43 29.35  2.87 2329.68 2.87                48.26676
## Austria   12.07 23.32  4.41 1507.99 3.93                38.83285
## Belgium   13.17 23.80  4.43 2108.47 3.82                45.91808
## Bolivia    5.75 41.89  1.67  189.13 0.22                13.75245
## Brazil    12.88 42.19  0.83  728.47 4.56                26.99018
## Canada     8.79 31.72  2.85 2982.88 2.43                54.61575
#se crea una columna raiz de dpi que será cambiada
colum.cambiad.Life = con.Colum.Life %>% mutate(colum.que.sera.cambiada = 
case_when(sr > 9.671 ~ 1,sr<= 9.671  ~ 2, TRUE ~ NA_real_))
head(colum.cambiad.Life)
##              sr pop15 pop75     dpi ddpi colum.que.sera.cambiada
## Australia 11.43 29.35  2.87 2329.68 2.87                       1
## Austria   12.07 23.32  4.41 1507.99 3.93                       1
## Belgium   13.17 23.80  4.43 2108.47 3.82                       1
## Bolivia    5.75 41.89  1.67  189.13 0.22                       2
## Brazil    12.88 42.19  0.83  728.47 4.56                       1
## Canada     8.79 31.72  2.85 2982.88 2.43                       2

Select para elegir variables o columnas

Borrar una columna

Borrar una columna con “select” del paquete dplyr.

head(LifeCycleSavings)
##              sr pop15 pop75     dpi ddpi
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
## Canada     8.79 31.72  2.85 2982.88 2.43
head(dplyr::select(LifeCycleSavings, -pop75))
##              sr pop15     dpi ddpi
## Australia 11.43 29.35 2329.68 2.87
## Austria   12.07 23.32 1507.99 3.93
## Belgium   13.17 23.80 2108.47 3.82
## Bolivia    5.75 41.89  189.13 0.22
## Brazil    12.88 42.19  728.47 4.56
## Canada     8.79 31.72 2982.88 2.43

Borrar columnas por nombre usando starts_with y ends_with.

Se borrarán las columnas en el dataframe “LifeCycleSavings” que empiezan con “p”.

names(LifeCycleSavings)
## [1] "sr"    "pop15" "pop75" "dpi"   "ddpi"
Life.no.col.names.start.with.p <- select(LifeCycleSavings, -starts_with("p"))
names(Life.no.col.names.start.with.p)
## [1] "sr"   "dpi"  "ddpi"

Se borrarán las columnas en el dataframe “LifeCycleSavings” que acaban con “i”.

Life.no.col.names.ends.with.i <- select(LifeCycleSavings, -ends_with("i"))
names(Life.no.col.names.ends.with.i)
## [1] "sr"    "pop15" "pop75"

Select_all para aplicar una función a todas las columnas.

La función toupper coloca en mayúscula las variables de LifeCycleSavings.

head(LifeCycleSavings)
##              sr pop15 pop75     dpi ddpi
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
## Canada     8.79 31.72  2.85 2982.88 2.43
nuevo.Life <- select_all(LifeCycleSavings, toupper)
 head(nuevo.Life)  #Base de datos después de las función toupper.
##              SR POP15 POP75     DPI DDPI
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
## Canada     8.79 31.72  2.85 2982.88 2.43

Seleccionar columnas usando la función pull.

Para seleccionar las categorías de la primera columna de los datos “mpg” se usa la función pull, además para solo mostrar una vez cada categoría se utiliza la función unique.

data("mpg")
pull.primera.col=unique(pull(mpg,1)) # el número uno representa la primera 
                            #columna
head(pull.primera.col)
## [1] "audi"      "chevrolet" "dodge"     "ford"      "honda"     "hyundai"

También se puede seleccionar la columna de izquierda a derecha poniendo en el segundo argumento de la función pull -1.

pull.última.col=unique(pull(mpg,-1)) # el número uno representa la primera 
                                     #columna
pull.última.col
## [1] "compact"    "midsize"    "suv"        "2seater"    "minivan"   
## [6] "pickup"     "subcompact"

Seleccionar filas: de cualquier variable conocer alguna condición.

Se filtrarán los datos de todas las variables de LifeCycleSavings que tengan un valor mayor a 2600.

nrow(LifeCycleSavings)
## [1] 50
Life.mas.de.2600 <- filter_all(LifeCycleSavings, any_vars(. > 2600))
head(Life.mas.de.2600)
##                  sr pop15 pop75     dpi ddpi
## Canada         8.79 31.72  2.85 2982.88 2.43
## Sweden         6.86 21.44  4.54 3299.49 3.01
## Switzerland   14.13 23.49  3.73 2630.96 2.70
## United States  7.56 29.81  3.43 4001.89 2.45
nrow(Life.mas.de.2600)
## [1] 4

Seleccionar columnas: omitiendo un caracter en específico del nombre de las columnas.

names(LifeCycleSavings)
## [1] "sr"    "pop15" "pop75" "dpi"   "ddpi"
life.no.r <- LifeCycleSavings %>%  select(-contains("r"))
names(life.no.r)
## [1] "pop15" "pop75" "dpi"   "ddpi"

Ahora se seleccionan las variables que contengan unas letras en específico.

names(LifeCycleSavings)
## [1] "sr"    "pop15" "pop75" "dpi"   "ddpi"
subset.Life <- select(LifeCycleSavings,  matches("pop|s"))
names(subset.Life)
## [1] "sr"    "pop15" "pop75"

Joins: Manipulación de datos de dos fuentes.

Left_Join (más común).

Primero se crearán dos dataframes con la columna sr en común, para luego utilizar Left Join y unirlos.

primer.df= select(LifeCycleSavings,sr,pop15)
head(primer.df) 
##              sr pop15
## Australia 11.43 29.35
## Austria   12.07 23.32
## Belgium   13.17 23.80
## Bolivia    5.75 41.89
## Brazil    12.88 42.19
## Canada     8.79 31.72
segundo.df=select(LifeCycleSavings,sr,pop75)
head(segundo.df)
##              sr pop75
## Australia 11.43  2.87
## Austria   12.07  4.41
## Belgium   13.17  4.43
## Bolivia    5.75  1.67
## Brazil    12.88  0.83
## Canada     8.79  2.85
primer.y.segundo= primer.df %>% left_join(segundo.df, by = "sr")
head(primer.y.segundo)
##      sr pop15 pop75
## 1 11.43 29.35  2.87
## 2 12.07 23.32  4.41
## 3 13.17 23.80  4.43
## 4  5.75 41.89  1.67
## 5 12.88 42.19  0.83
## 6  8.79 31.72  2.85

Inner_Join

Se crean dos tablas de datos, un con los goles por jugador y otra con partidos jugados en club y selección, con la opción inner_join se unirán los nombres que coincidan en las dos tablas.

jugadores=c("Messi", "Mbappé", "Haland", "Lewandowski","Ronaldo" )
goles=c(33,32,31,41,27)
gol.x.jugador=data.frame(jugadores,goles)
jugadores=c("Harry Kane", "Karim Benzema","Messi","Lewandowski","Ronaldo" )
partidos=c(39,36,39,32,40)
jugadores.x.partido=data.frame(jugadores,partidos)
gol.jugador.partido <- inner_join(gol.x.jugador,jugadores.x.partido, by = "jugadores")
gol.jugador.partido
##     jugadores goles partidos
## 1       Messi    33       39
## 2 Lewandowski    41       32
## 3     Ronaldo    27       40

Anti_Join.

Se hará la uniónn de los dos dataframes creados anteriormente pero esta vez la opción anti_join nos muestra los nombres de los jugadores los cuales no se conoce la cantidad de partidos jugados.

no.info.partidos=anti_join(gol.x.jugador,jugadores.x.partido, by = "jugadores")
no.info.partidos
##   jugadores goles
## 1    Mbappé    32
## 2    Haland    31

Full_Join.

Se presenta la información de los jugadores, toda en una tabla, tenga en cuenta que en los datos faltantes se representan como NA.

Todos.los.jugadores=full_join(gol.x.jugador,jugadores.x.partido, by = "jugadores")
Todos.los.jugadores
##       jugadores goles partidos
## 1         Messi    33       39
## 2        Mbappé    32       NA
## 3        Haland    31       NA
## 4   Lewandowski    41       32
## 5       Ronaldo    27       40
## 6    Harry Kane    NA       39
## 7 Karim Benzema    NA       36

Semi_Join.

Para esta función el orden importa, si vamos de la tabla de goles a la de partidos jugados apareceran los goles de los jugadores que están en ambas tablas, sin embargo si primero ponemos la tabla de partidos y luego la de goles, apareceran los partidos de los jugadores que están en las dos tablas.

semi.info.jug=semi_join(gol.x.jugador,jugadores.x.partido)
## Joining, by = "jugadores"
semi.info.jug
##     jugadores goles
## 1       Messi    33
## 2 Lewandowski    41
## 3     Ronaldo    27
semi.info.jug2=semi_join(jugadores.x.partido,gol.x.jugador)
## Joining, by = "jugadores"
semi.info.jug2
##     jugadores partidos
## 1       Messi       39
## 2 Lewandowski       32
## 3     Ronaldo       40

Right_Join.

La tabla de partidos jugados se anexa a la tabla de goles por jugador, Harry Kane y Karim Benzema no tienen informacion en la tabla de goles por este motivo aparece el NA.

 Right.join.jugad<- right_join(gol.x.jugador,jugadores.x.partido, by = "jugadores")
Right.join.jugad
##       jugadores goles partidos
## 1         Messi    33       39
## 2   Lewandowski    41       32
## 3       Ronaldo    27       40
## 4    Harry Kane    NA       39
## 5 Karim Benzema    NA       36

Slice

La función slice permite elegir las filas que queramos, se van a tomar las primeras 5 filas de la tabla de datos.

Life.solo.5filas=slice(LifeCycleSavings,-6:-n())
Life.solo.5filas
##              sr pop15 pop75     dpi ddpi
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
nrow(LifeCycleSavings)-nrow(Life.solo.5filas) #Diferencia de filas entre el 
## [1] 45
                                              # dataframe original

Summarise

Summarise y group_by

Con la tabla de datos “mpg” se usarán las funciones summarise y group_by.

se halla a cuantos carros están registrados.

mpg %>% summarise(contar=n())
## # A tibble: 1 x 1
##   contar
##    <int>
## 1    234

Ahora si se requiere contar la cantidad de carros por modelo(año) se usa la función group_by.

mpg %>% group_by(year) %>% summarise(contar=n())
## # A tibble: 2 x 2
##    year contar
##   <int>  <int>
## 1  1999    117
## 2  2008    117

se presentán ahora las estadísticas generales de cilindrada por año.

mpg %>% group_by(year) %>% summarise(promedio.cilin. = mean(cyl),
median.cilin = median(cyl), std.dev.cilin = sd(cyl),
median.abs.deviation = mad(cyl),  IQR.cilin = IQR(cyl))
## # A tibble: 2 x 6
##    year promedio.cilin. median.cilin std.dev.cilin median.abs.deviati~ IQR.cilin
##   <int>           <dbl>        <int>         <dbl>               <dbl>     <dbl>
## 1  1999            5.69            6          1.55                2.97         2
## 2  2008            6.09            6          1.66                2.97         4

también se puede hallar el mínimo y máximo cilindraje por año.

 mpg %>% group_by(year) %>% 
 summarise(min.cil = min(cyl), max.cil = max(cyl))
## # A tibble: 2 x 3
##    year min.cil max.cil
##   <int>   <int>   <int>
## 1  1999       4       8
## 2  2008       4       8

Summarise Across

Across es una función que aplica la orden a todo el dataframe aqui vemos un uso con summarise.

 mpg %>%  na.omit() %>% #quita todos los NA.
 group_by(model) %>%  summarise(across(where(is.numeric), mean,
 .names = "mean_{col}")) %>%
 head()
## # A tibble: 6 x 6
##   model              mean_displ mean_year mean_cyl mean_cty mean_hwy
##   <chr>                   <dbl>     <dbl>    <dbl>    <dbl>    <dbl>
## 1 4runner 4wd              3.48     2002      5.67     15.2     18.8
## 2 a4                       2.33     2003.     4.86     18.9     28.3
## 3 a4 quattro               2.42     2004.     5        17.1     25.8
## 4 a6 quattro               3.37     2005      6.67     16       24  
## 5 altima                   2.8      2005      4.67     20.7     28.7
## 6 c1500 suburban 2wd       5.52     2006.     8        12.8     17.8

Se usa summarise para contar el numero de carros que cumplan con el mismo nombre manufactura y modelo.

new.mpg = mpg %>% group_by(manufacturer, model)
Sum.mpg = summarise(new.mpg,n())
## `summarise()` has grouped output by 'manufacturer'. You can override using the `.groups` argument.
Sum.mpg
## # A tibble: 38 x 3
## # Groups:   manufacturer [15]
##    manufacturer model              `n()`
##    <chr>        <chr>              <int>
##  1 audi         a4                     7
##  2 audi         a4 quattro             8
##  3 audi         a6 quattro             3
##  4 chevrolet    c1500 suburban 2wd     5
##  5 chevrolet    corvette               5
##  6 chevrolet    k1500 tahoe 4wd        4
##  7 chevrolet    malibu                 5
##  8 dodge        caravan 2wd           11
##  9 dodge        dakota pickup 4wd      9
## 10 dodge        durango 4wd            7
## # ... with 28 more rows

Si solo está interesado en el total, puede usar otro pipe.

new.mpg2 = mpg %>% group_by(manufacturer, model) %>% summarise(n())
## `summarise()` has grouped output by 'manufacturer'. You can override using the `.groups` argument.
new.mpg2
## # A tibble: 38 x 3
## # Groups:   manufacturer [15]
##    manufacturer model              `n()`
##    <chr>        <chr>              <int>
##  1 audi         a4                     7
##  2 audi         a4 quattro             8
##  3 audi         a6 quattro             3
##  4 chevrolet    c1500 suburban 2wd     5
##  5 chevrolet    corvette               5
##  6 chevrolet    k1500 tahoe 4wd        4
##  7 chevrolet    malibu                 5
##  8 dodge        caravan 2wd           11
##  9 dodge        dakota pickup 4wd      9
## 10 dodge        durango 4wd            7
## # ... with 28 more rows

Gathering: Convierta varias columnas en una.

Se tiene una tabla de datos (inventada) de la contaminación del aire de 5 países en los tres años anteriores al 2021 y con la ayuda de gather se juntan todos los países en una sola columna.

año=c("2018","2019","2020")
Chile=c(14,25,34)
Brazil=c(21,41,38)
Suiza=c(10,15,9)
Dinamarca=c(54,44,28)
Turquía=c(30,21,8)

tabla1=data.frame(año,Chile,Brazil,Suiza,Dinamarca,Turquía) #antes de gather.
tabla1
##    año Chile Brazil Suiza Dinamarca Turquía
## 1 2018    14     21    10        54      30
## 2 2019    25     41    15        44      21
## 3 2020    34     38     9        28       8
IQA.pais <- tabla1 %>%  
  gather("Chile", "Brazil", "Suiza","Dinamarca","Turquía", key = "Países",
         value = "IQA")
IQA.pais
##     año    Países IQA
## 1  2018     Chile  14
## 2  2019     Chile  25
## 3  2020     Chile  34
## 4  2018    Brazil  21
## 5  2019    Brazil  41
## 6  2020    Brazil  38
## 7  2018     Suiza  10
## 8  2019     Suiza  15
## 9  2020     Suiza   9
## 10 2018 Dinamarca  54
## 11 2019 Dinamarca  44
## 12 2020 Dinamarca  28
## 13 2018   Turquía  30
## 14 2019   Turquía  21
## 15 2020   Turquía   8

Spreading: Consolidar multiples filas en una.

la información está contenida en múltiples columnas, por lo tanto se usa la función spread para separar la variable sexo con respecto al puntaje.

df1= data.frame(equipos=c("rojo","rojo","azul","azul"),
                sexo=c("mujer","hombre","hombre","mujer"),puntaje=c(5,7,3,9))
df1
##   equipos   sexo puntaje
## 1    rojo  mujer       5
## 2    rojo hombre       7
## 3    azul hombre       3
## 4    azul  mujer       9
df2 <- df1  %>% spread(key=sexo, value=puntaje)
df2
##   equipos hombre mujer
## 1    azul      3     9
## 2    rojo      7     5

Separate: Divida una columna en múltiples columnas.

Retomando la tabla de datos creada de los goles marcados por jugadores se añade la variable fecha de nacimiento separada por guiones.

jugadores=c("Messi", "Mbappé", "Haland", "Lewandowski","Ronaldo" )
goles=c(33,32,31,41,27)
fecha.nac=c("24-06-1987","20-12-1998","21-07-2000","21-08-1988","5-02-1985")
gol.x.jugador=data.frame(jugadores,goles,fecha.nac)
gol.x.jugador
##     jugadores goles  fecha.nac
## 1       Messi    33 24-06-1987
## 2      Mbappé    32 20-12-1998
## 3      Haland    31 21-07-2000
## 4 Lewandowski    41 21-08-1988
## 5     Ronaldo    27  5-02-1985

Ahora se separa la fecha en tres columnas diferentes.

gol.x.jug.separ.x.fecha <- gol.x.jugador %>%
 separate(fecha.nac, into = c("dia", "mes","año"), sep = "-")
gol.x.jug.separ.x.fecha
##     jugadores goles dia mes  año
## 1       Messi    33  24  06 1987
## 2      Mbappé    32  20  12 1998
## 3      Haland    31  21  07 2000
## 4 Lewandowski    41  21  08 1988
## 5     Ronaldo    27   5  02 1985

Resumen de práctica funciones DPLYR.

número de observaciones (n) usadas a través de múltiples funciones DPLYR.

Conteos Básicos.

Para mostrar el conteo con (n) se llamará la tabla de datos new.mpg que ordena los datos mpg por manufacturador y modelo, luego se crea la fila n() que cuenta los carros que cumplen esas dos características.

m <- mutate(new.mpg, kount = n())#new variable, kount added to extreme right
m[,c(1,2,5,12)]
## # A tibble: 234 x 4
## # Groups:   manufacturer, model [38]
##    manufacturer model        cyl kount
##    <chr>        <chr>      <int> <int>
##  1 audi         a4             4     7
##  2 audi         a4             4     7
##  3 audi         a4             4     7
##  4 audi         a4             4     7
##  5 audi         a4             6     7
##  6 audi         a4             6     7
##  7 audi         a4             6     7
##  8 audi         a4 quattro     4     8
##  9 audi         a4 quattro     4     8
## 10 audi         a4 quattro     4     8
## # ... with 224 more rows

Ahora con la opción filter se tendrán en cuenta los conteos mayores estrictos a 10.

filter(new.mpg, n() > 10)
## # A tibble: 11 x 11
## # Groups:   manufacturer, model [1]
##    manufacturer model    displ  year   cyl trans   drv     cty   hwy fl    class
##    <chr>        <chr>    <dbl> <int> <int> <chr>   <chr> <int> <int> <chr> <chr>
##  1 dodge        caravan~   2.4  1999     4 auto(l~ f        18    24 r     mini~
##  2 dodge        caravan~   3    1999     6 auto(l~ f        17    24 r     mini~
##  3 dodge        caravan~   3.3  1999     6 auto(l~ f        16    22 r     mini~
##  4 dodge        caravan~   3.3  1999     6 auto(l~ f        16    22 r     mini~
##  5 dodge        caravan~   3.3  2008     6 auto(l~ f        17    24 r     mini~
##  6 dodge        caravan~   3.3  2008     6 auto(l~ f        17    24 r     mini~
##  7 dodge        caravan~   3.3  2008     6 auto(l~ f        11    17 e     mini~
##  8 dodge        caravan~   3.8  1999     6 auto(l~ f        15    22 r     mini~
##  9 dodge        caravan~   3.8  1999     6 auto(l~ f        15    21 r     mini~
## 10 dodge        caravan~   3.8  2008     6 auto(l~ f        16    23 r     mini~
## 11 dodge        caravan~   4    2008     6 auto(l~ f        16    23 r     mini~

Funciones Nth .

La función Nth sirve para buscar datos específicos de un vector, se toman los nombres de las variables de los datos LifeCycleSavings.

names.Life=as.vector(names(LifeCycleSavings)) # Crear vector de nombres de los
                                              #datos LifeCycleSavings.
first(names.Life)  # Primer dato del vector names.Life.
## [1] "sr"
last(names.Life)   #Último dato.
## [1] "ddpi"
nth(names.Life,-3) #Tercer dato contando del último.
## [1] "pop75"
nth(names.Life,2)  #Segundo dato contando del primero.
## [1] "pop15"

Contando diferentes valores.

Se contarán la cantidad de filas de la variable manufacturer de los datos mpg, luego de la misma variable se contarán cuantos valores únicos existen en ese mismo vector.

mpg.vector= t(mpg[,1]) #se toma transpuesto para medir su largo.
length(mpg.vector) #se mide el largo del vector por columnas.
## [1] 234
n_distinct(mpg[,1]) #se cuentan los valores que son diferentes
## [1] 15

na_if

Cuando hay valores de error por cálculos matemáticos se puede reemplazar dicho error por la salida NA.

test <- c(12,25, 0, 81)
a <- 4000/test
a
## [1] 333.33333 160.00000       Inf  49.38272
b <- 20000/na_if(test,0) # si algún cero se encuentra en el vector test
b
## [1] 1666.6667  800.0000        NA  246.9136
class(b)  # Muestra la que clase de vector es.
## [1] "numeric"

Coalesce para reemplazar valores faltantes.

Se toma el vector b creado anteriormente y se reemplaza por algún valor en este caso cero.

coalesce(b,0)
## [1] 1666.6667  800.0000    0.0000  246.9136

Funciones de clasificación.

Clasificación por índices.

Cuando se tiene un vector numérico se puede encontrar el orden del vector con la función row_number la cual cambia el número más bajo por 1, el siguiente por 2, así sucesivamente hasta organizar los n números.

y = c(98,4,17,4,5,3)
rank = row_number(y)
rank
## [1] 6 2 5 3 4 1
y[rank[1]]  #El número más bajo del vector.
## [1] 3
y[rank[6]]  #El número más alto del vector.
## [1] 98

Rango mínimo

rank2=min_rank(y)
rank2
## [1] 6 2 5 2 4 1

Dense_rank

Dense_rank no da un rank de salida a los números repetidos para este vector, existe un valor repetido el 4 por esto el máximo rango es 5.

rank3 <- dense_rank(y)
rank3
## [1] 5 2 4 2 3 1

percent_rank

rank4 <- percent_rank(y)
rank4
## [1] 1.0 0.2 0.8 0.2 0.6 0.0

Función de distribución acumulada.

y <- c(98,4,17,4,5,3)
rank5 <- cume_dist(y)
rank5
## [1] 1.0000000 0.5000000 0.8333333 0.5000000 0.6666667 0.1666667
rank6 = ntile(y, 3) #se eligen 3 espacios
rank6
## [1] 3 1 3 2 2 1

Una manera más simple de leer la función de cuantiles de R.

test.vector <- c(98,4,17,4,5,3)
quantile(test.vector, prob = seq(0,1,length = 11),type = 5)
##   0%  10%  20%  30%  40%  50%  60%  70%  80%  90% 100% 
##  3.0  3.1  3.7  4.0  4.0  4.5  6.2 13.4 41.3 89.9 98.0

Muestreo.

De la tabla de datos que se viene manejando “LifeCyclingSavings”, se toma una muestra aleatoria de 5 países.

set.seed(1)  #Para reproducir siempre los mismos 5 datos pseudoaleatorios.
my.sample <- sample_n(LifeCycleSavings, 5)
my.sample
##                sr pop15 pop75     dpi ddpi
## Bolivia      5.75 41.89  1.67  189.13 0.22
## Sweden       6.86 21.44  4.54 3299.49 3.01
## Australia   11.43 29.35  2.87 2329.68 2.87
## Philippines 12.78 46.26  1.12  152.01 2.00
## Japan       21.10 27.01  1.91 1257.28 8.21

Dependiendo del propósito del estudio se puede pedir que la muestra tomada aleatoriamente se puedan repetir.

set.seed(2)
my.sample1 <- sample_n(LifeCycleSavings, 10, replace = TRUE)
my.sample1
##                  sr pop15 pop75     dpi ddpi
## Ireland       11.34 31.16  4.19 1139.95 2.99
## Germany       12.55 23.31  3.35 2457.12 3.44
## Canada...3     8.79 31.72  2.85 2982.88 2.43
## Canada...4     8.79 31.72  2.85 2982.88 2.43
## Paraguay       2.02 41.18  1.05  220.56 1.03
## China         11.90 44.75  0.67  289.52 6.51
## Guatamala...7  3.01 46.05  0.87  289.71 1.48
## New Zealand   10.67 32.61  3.17 1487.52 1.76
## Guatamala...9  3.01 46.05  0.87  289.71 1.48
## Ecuador        3.59 46.31  1.19  287.77 2.19

Para este ejemplo canadá y guatemala se repite dos veces.

Muchas veces es necesario sesgar la información para esto usamos la función weight con los datos que se “prefiere” que salgan, en este caso los carros que gastan más millas por galón en la ciudad de la tabla de datos mpg.

set.seed(3)
my.sample2 = sample_n(mpg, 12, weight = cty) 
my.sample2[,c(1,2,8,11)]
## # A tibble: 12 x 4
##    manufacturer model             cty class     
##    <chr>        <chr>           <int> <chr>     
##  1 toyota       camry solara       21 compact   
##  2 ford         f150 pickup 4wd    14 pickup    
##  3 nissan       maxima             19 midsize   
##  4 volkswagen   jetta              19 compact   
##  5 hyundai      tiburon            16 subcompact
##  6 volkswagen   passat             16 midsize   
##  7 toyota       camry solara       22 compact   
##  8 subaru       impreza awd        20 compact   
##  9 dodge        caravan 2wd        17 minivan   
## 10 toyota       4runner 4wd        16 suv       
## 11 chevrolet    malibu             18 midsize   
## 12 dodge        caravan 2wd        18 minivan

Sample_frac sirve para tomar una muestra porcentual de la tabla de datos, para este ejemplo se eligió el 25% de la tabla original LifeCyclingSavings aleatoriamente.

set.seed(4)
test1 <- sample_frac(LifeCycleSavings, 0.25)
test1
##                  sr pop15 pop75     dpi ddpi
## Denmark       16.85 24.42  3.93 2496.53 3.99
## Belgium       13.17 23.80  4.43 2108.47 3.82
## Chile          0.60 39.74  1.34  662.86 2.67
## United States  7.56 29.81  3.43 4001.89 2.45
## Nicaragua      7.30 45.04  1.21  325.54 2.48
## Spain         11.77 27.74  2.87  768.79 4.35
## Austria       12.07 23.32  4.41 1507.99 3.93
## Korea          3.98 41.74  0.91  207.68 5.81
## Australia     11.43 29.35  2.87 2329.68 2.87
## India          9.00 41.31  0.96   88.94 1.54
## Portugal      12.49 28.96  2.85  579.51 7.48
## Norway        10.25 25.95  3.67 2231.03 3.62

Primero group_by identifica los carros por cilindraje y de estos selecciona el 7% de los grupos, esto lo hace con repetición.

set.seed(5)
agrupe.x.cilindraje = mpg %>% group_by(cyl)
agrupe.x.cilindraje
## # A tibble: 234 x 11
## # Groups:   cyl [4]
##    manufacturer model      displ  year   cyl trans drv     cty   hwy fl    class
##    <chr>        <chr>      <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr>
##  1 audi         a4           1.8  1999     4 auto~ f        18    29 p     comp~
##  2 audi         a4           1.8  1999     4 manu~ f        21    29 p     comp~
##  3 audi         a4           2    2008     4 manu~ f        20    31 p     comp~
##  4 audi         a4           2    2008     4 auto~ f        21    30 p     comp~
##  5 audi         a4           2.8  1999     6 auto~ f        16    26 p     comp~
##  6 audi         a4           2.8  1999     6 manu~ f        18    26 p     comp~
##  7 audi         a4           3.1  2008     6 auto~ f        18    27 p     comp~
##  8 audi         a4 quattro   1.8  1999     4 manu~ 4        18    26 p     comp~
##  9 audi         a4 quattro   1.8  1999     4 auto~ 4        16    25 p     comp~
## 10 audi         a4 quattro   2    2008     4 manu~ 4        20    28 p     comp~
## # ... with 224 more rows
my.sample3 <- sample_frac(agrupe.x.cilindraje, .07, replace = TRUE)

tally y count hace conteos básicos y por grupos.

row.kount.only <- LifeCycleSavings %>% tally()
row.kount.only
##    n
## 1 50

Se contarán cuantos carros hay por cilindraje con la función count.

cyl.kount <- mpg %>% count(cyl)
cyl.kount
## # A tibble: 4 x 2
##     cyl     n
##   <int> <int>
## 1     4    81
## 2     5     4
## 3     6    79
## 4     8    70

Micelánea de las funciones DPLYR.

add_count para filtrado por grupos.

En este caso se buscan los carros que no tienen millas por galón en común con otros carros.

cty.solo.uno <- mpg %>%  add_count(cty) %>%  filter(n == 1)
cty.solo.uno
## # A tibble: 3 x 12
##   manufacturer model displ  year   cyl trans drv     cty   hwy fl    class     n
##   <chr>        <chr> <dbl> <int> <int> <chr> <chr> <int> <int> <chr> <chr> <int>
## 1 volkswagen   jetta   1.9  1999     4 manu~ f        33    44 d     comp~     1
## 2 volkswagen   new ~   1.9  1999     4 manu~ f        35    44 d     subc~     1
## 3 volkswagen   new ~   1.9  1999     4 auto~ f        29    41 d     subc~     1

Rename.

Es útil para cambiar el nombre de algunas variables.

head(LifeCycleSavings)
##              sr pop15 pop75     dpi ddpi
## Australia 11.43 29.35  2.87 2329.68 2.87
## Austria   12.07 23.32  4.41 1507.99 3.93
## Belgium   13.17 23.80  4.43 2108.47 3.82
## Bolivia    5.75 41.89  1.67  189.13 0.22
## Brazil    12.88 42.19  0.83  728.47 4.56
## Canada     8.79 31.72  2.85 2982.88 2.43
head(rename(LifeCycleSavings, Ahorros=sr)) #solo mostrar los primeros resultados
##           Ahorros pop15 pop75     dpi ddpi
## Australia   11.43 29.35  2.87 2329.68 2.87
## Austria     12.07 23.32  4.41 1507.99 3.93
## Belgium     13.17 23.80  4.43 2108.47 3.82
## Bolivia      5.75 41.89  1.67  189.13 0.22
## Brazil      12.88 42.19  0.83  728.47 4.56
## Canada       8.79 31.72  2.85 2982.88 2.43
                                           #y visualizar el cambio.

case_when.

Se combina con mutate y es útil para crear una nueva columna con información adicional según las características del individuo.

Para este ejemplo se usarán los datos LifeCycleSavings y se pondrá una columna adicional “valoración” que representa si el crecimiento dpi es bueno malo o regular.

nueva.var.LifeCycleSavings = LifeCycleSavings %>% 
  mutate(Valoración=case_when(ddpi < 2~"malo", ddpi >= 2 & ddpi<= 4~ "regular",
                               ddpi>4~"bueno"))
head(nueva.var.LifeCycleSavings)
##              sr pop15 pop75     dpi ddpi Valoración
## Australia 11.43 29.35  2.87 2329.68 2.87    regular
## Austria   12.07 23.32  4.41 1507.99 3.93    regular
## Belgium   13.17 23.80  4.43 2108.47 3.82    regular
## Bolivia    5.75 41.89  1.67  189.13 0.22       malo
## Brazil    12.88 42.19  0.83  728.47 4.56      bueno
## Canada     8.79 31.72  2.85 2982.88 2.43    regular