6.6 Selección

Al igual que con el filtrado de filas, una sola función para seleccionar columnas, select(). La función devuelve solo las columnas seleccionadas, ya sea utilizando sus nombres o su indexación de posición. El orden en el que coloques las columnas dentro de la función será el orden en el que aparecerán en el resultado final.

A partir de la reciente versión de R 4.1.3., en algunos equipos es necesario colocar dplyr::select() en lugar de simplemente usar select(). Si en tu equipo funciona directamente select(), no te preocupes en mencionar de qué paquete procede.

Ejemplo 6.8 Considerando la base de datos WHO, seleccionar las columnas Country, Year, Polio, Diph, utilizando posición y nombre. Mostrar las primeras 6 filas.

# Por posición
WHO %>% 
  dplyr::select(1,2,17,18) %>% 
  head()
#       Country Year Polio Tot_exp
# 1 Afghanistan 2015     6    8.16
# 2 Afghanistan 2014    58    8.18
# 3 Afghanistan 2013    62    8.13
# 4 Afghanistan 2012    67    8.52
# 5 Afghanistan 2011    68    7.87
# 6 Afghanistan 2010    66    9.20

# Por nombre
WHO %>% 
  dplyr::select(Country, Year, Polio, Diph) %>% 
  head()
#       Country Year Polio Diph
# 1 Afghanistan 2015     6   65
# 2 Afghanistan 2014    58   62
# 3 Afghanistan 2013    62   64
# 4 Afghanistan 2012    67   67
# 5 Afghanistan 2011    68   68
# 6 Afghanistan 2010    66   66

Lo más complicado de indexar por posición es justamente saber el número exacto de cada columna. En cualquiera de los casos, revisar los nombres de columnas se puede realizar con names():

names(WHO)
#  [1] "Country"    "Year"       "Status1"    "Category"   "Level"      "Status2"   
#  [7] "St2_categ"  "Life_exp"   "Ad_mort"    "Inf_deaths" "Alcohol"    "Per_exp"   
# [13] "Hep_B"      "Measles"    "BMI"        "U5Y"        "Polio"      "Tot_exp"   
# [19] "Diph"       "AIDS"       "GDP"        "Pop"        "Thin1_19"   "Thin5_9"   
# [25] "Income"     "Schooling"

6.6.1 Seleccionar con funciones especiales

Para aprovechar al máximo la función select(), se puede incluir en ella funciones de selección específicas con funciones de ayuda.

Tabla 6.1: Funciones de selección específicas utilizando funciones de ayuda
Función Descripción
select(DF, contains(".")) Selecciona las columnas cuyo nombre contengan ese carácter.
select(DF, num_range("a", 1:5)) Selecciona las columnas a1, a2, a3, a4, y a5.
select(DF, starts_with("XYZ")) Selecciona las columnas cuyo nombre comience con “XYZ”.
select(DF, ends_with("XYZ")) Selecciona las columnas cuyo nombre termina en “XYZ”.

Ejemplo 6.9 Seleccionar todas las columnas que contengan el carácter _. Mostrar las primeras 6 filas.

WHO %>% 
  dplyr::select(contains("_")) %>% 
  head()
#   St2_categ Life_exp Ad_mort Inf_deaths Per_exp Hep_B Tot_exp Thin1_19 Thin5_9
# 1         1     65.0     263         62  71.280    65    8.16     17.2    17.3
# 2         2     59.9     271         64  73.524    62    8.18     17.5    17.5
# 3         2     59.9     268         66  73.219    64    8.13     17.7    17.7
# 4         1     59.5     272         69  78.184    67    8.52     17.9    18.0
# 5         2     59.2     275         71   7.097    68    7.87     18.2    18.2
# 6         1     58.8     279         74  79.679    66    9.20     18.4    18.4

La función num_range("TEXTO", RANGO) crea un vector de caracteres de la misma manera que lo hace paste0(). La diferencia es que num_range() solo funciona dentro de select().

# Resultado de paste0() idéntico a lo que se obtendría con num_range()
paste0("Status", 1:5)
# [1] "Status1" "Status2" "Status3" "Status4" "Status5"

Ejemplo 6.10 Seleccionar todas las columnas Status1 y Status2 con la función num_range(). Mostrar las primeras 6 filas.

# Con num_range()
WHO %>% 
  dplyr::select(num_range("Status", 1:2)) %>% 
  head()
#      Status1                                       Status2
# 1 Developing Developing in an inconsisten rate of increase
# 2 Developing          No deteminated by the OMS, but is OK
# 3 Developing          No deteminated by the OMS, but is OK
# 4 Developing Developing in an inconsisten rate of increase
# 5 Developing          No deteminated by the OMS, but is OK
# 6 Developing Developing in an inconsisten rate of increase

# Con paste0()
WHO %>% 
  dplyr::select(paste0("Status", 1:2)) %>% 
  head()
#      Status1                                       Status2
# 1 Developing Developing in an inconsisten rate of increase
# 2 Developing          No deteminated by the OMS, but is OK
# 3 Developing          No deteminated by the OMS, but is OK
# 4 Developing Developing in an inconsisten rate of increase
# 5 Developing          No deteminated by the OMS, but is OK
# 6 Developing Developing in an inconsisten rate of increase
Las dos funciones que se verán a continuación permiten seleccionar utilizando una o varias letras iniciales o finales de cada nombre. La búsqueda no es sensible a si la letra es mayúscula o minúscula.

Ejemplo 6.11 Seleccionar las columnas cuyo nombre comience con la letra S. Mostrar las primeras 6 filas.

# Con num_range()
WHO %>% 
  dplyr::select(starts_with("S")) %>% 
  head()
#      Status1                                       Status2 St2_categ Schooling
# 1 Developing Developing in an inconsisten rate of increase         1      10.1
# 2 Developing          No deteminated by the OMS, but is OK         2      10.0
# 3 Developing          No deteminated by the OMS, but is OK         2       9.9
# 4 Developing Developing in an inconsisten rate of increase         1       9.8
# 5 Developing          No deteminated by the OMS, but is OK         2       9.5
# 6 Developing Developing in an inconsisten rate of increase         1       9.2

Ejemplo 6.12 Seleccionar las columnas cuyo nombre termine con la letra o. Mostrar las primeras 6 filas.

# Con num_range()
WHO %>% 
  dplyr::select(ends_with("o")) %>% 
  head()
#   Polio
# 1     6
# 2    58
# 3    62
# 4    67
# 5    68
# 6    66