Seleccionar columnas en R con dplyr

Seleccionar columnas en R con dplyr

Selecciona o elimina columnas de un data frame con la función select de dplyr y aprende a usar funciones de ayuda para seleccionar columnas como contains, matches, all_of, any_of, starts_with, ends_with, last_col, where, num_range y everything.

Datos de ejemplo para este tutorial

En este tutorial utilizaremos como datos de ejemplo las cinco primeras filas y las seis primeras columnas del conjunto de datos starwars de dplyr.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Vemos los datos
df
# A tibble: 5 × 6
  name           height  mass hair_color skin_color  eye_color
  <chr>           <int> <dbl> <chr>      <chr>       <chr>    
1 Luke Skywalker    172    77 blond      fair        blue     
2 C-3PO             167    75 NA         gold        yellow   
3 R2-D2              96    32 NA         white, blue red      
4 Darth Vader       202   136 none       white       yellow   
5 Leia Organa       150    49 brown      light       brown 

Seleccionar columnas

La función select permite filtrar columnas de un data frame. Las columnas pueden seleccionarse por nombre o por índice/posición.

Por nombre

Dado un conjunto de datos, tendrás que especificar las columnas deseadas dentro de select con o sin comillas. Ten en cuenta que puedes seleccionar una o varias columnas a la vez.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Selecciona las columnas 'name' y 'height'
df_2 <- df %>%
  select(name, height) # O select(c("name", "height"))

df_2
# A tibble: 6 × 2
  name           height
  <chr>           <int>
1 Luke Skywalker    172
2 C-3PO             167
3 R2-D2              96
4 Darth Vader       202
5 Leia Organa       150

La función select() de dplyr en R

También puedes seleccionar una secuencia de columnas utilizando :. Por ejemplo, si quieres seleccionar las columnas desde height hasta skin_color, ambas incluidas, puedes escribir: height:skin_color

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Selecciona las columnas desde 'height' hasta 'skin_color'
df_2 <- df %>%
  select(height:skin_color)

df_2
# A tibble: 5 × 4
  height  mass hair_color skin_color 
   <int> <dbl> <chr>      <chr>      
1    172    77 blond      fair       
2    167    75 NA         gold       
3     96    32 NA         white, blue
4    202   136 none       white      
5    150    49 brown      light 

Seleccionar una secuencia de columnas con dplyr

Por índice

Las columnas también se pueden seleccionar por índice. Para ello basta con especificar los números de columna deseados dentro de select. El siguiente ejemplo selecciona la primera, la quinta y la sexta columna.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Selecciona la primera, quinta y sexta columna
df_2 <- df %>%
  select(1, 5, 6)

df_2
# A tibble: 5 × 2
  skin_color  eye_color
  <chr>       <chr>    
1 fair        blue     
2 gold        yellow   
3 white, blue red      
4 white       yellow   
5 light       brown  

Seleccionar columnas con dplyr por índice o posición

Además, puedes crear una secuencia de números para seleccionar un rango de columnas. El ejemplo siguiente se puede utilizar para seleccionar las primeras n columnas.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Primeras 4 columnas
n <- 4

# Selecciona las primeras 4 columnas
df_2 <- df %>%
  select(1:n)

df_2
# A tibble: 5 × 4
  name           height  mass hair_color
  <chr>           <int> <dbl> <chr>     
1 Luke Skywalker    172    77 blond     
2 C-3PO             167    75 NA        
3 R2-D2              96    32 NA        
4 Darth Vader       202   136 none      
5 Leia Organa       150    49 brown   

Selecciona las primeras n columnas con dplyr en R

Eliminar columnas

La función select también puede utilizarse para deseleccionar columnas. Para ello, sólo es necesario añadir el símbolo - antes del nombre de cada columna. En el siguiente ejemplo seleccionamos todas las columnas excepto mass.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Selecciona todas las columnas menos 'mass'
df_2 <- df %>%
  select(-mass)

df_2
# A tibble: 5 × 5
  name           height hair_color skin_color  eye_color
  <chr>           <int> <chr>      <chr>       <chr>    
1 Luke Skywalker    172 blond      fair        blue     
2 C-3PO             167 NA         gold        yellow   
3 R2-D2              96 NA         white, blue red      
4 Darth Vader       202 none       white       yellow   
5 Leia Organa       150 brown      light       brown 

Eliminar columnas de un data frame con la función select de dplyr

En caso de que quieras eliminar varias columnas puedes añadir - antes del nombre de cada columna o antes de un vector con los nombres.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Eliminamos 'height', 'mass' y 'hair_color'
df_2 <- df %>%
  select(-height, -mass, -hair_color) # O -c(height, mass, hair_color)

df_2
# A tibble: 5 × 3
  name           skin_color  eye_color
  <chr>          <chr>       <chr>    
1 Luke Skywalker fair        blue     
2 C-3PO          gold        yellow   
3 R2-D2          white, blue red      
4 Darth Vader    white       yellow   
5 Leia Organa    light       brown 

Eliminar columnas de un conjunto de datos en R con la función select de dplyr

Para eliminar un rango de columnas tendrás que utilizar el operador - y añadir la secuencia de columnas dentro de paréntesis, como en el ejemplo siguiente.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Seleccionar todas las columnas excepto la cuarta, la quinta y la sexta
df_2 <- df %>%
  select(-(4:6))

df_2
# A tibble: 5 × 3
  name           height  mass
  <chr>           <int> <dbl>
1 Luke Skywalker    172    77
2 C-3PO             167    75
3 R2-D2              96    32
4 Darth Vader       202   136
5 Leia Organa       150    49

Borrar columnas en R con la función select utilizando un índice

Operador de exclamación

Ten en cuenta que además del operador menos (-) existe el operador de exclamación (!), que niega los criterios de selección. Esto significa que selecciona todas las columnas y excluye las que coinciden con los criterios de selección.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Selecciona TODO menos "name"
df_2 <- df %>%
  select(!name)

df_2
# A tibble: 5 × 5
  height  mass hair_color skin_color  eye_color
   <int> <dbl> <chr>      <chr>       <chr>    
1    172    77 blond      fair        blue     
2    167    75 NA         gold        yellow   
3     96    32 NA         white, blue red      
4    202   136 none       white       yellow   
5    150    49 brown      light       brown  

No confundas el símbolo menos (-) con el signo de exclamación (!). Aunque ambos operadores se utilizan para excluir columnas en la función select de dplyr, el operador - especifica explícitamente las columnas a eliminar, mientras que el operador ! selecciona TODAS las columnas EXCEPTO las que coinciden con los criterios especificados.

Funciones de ayuda para seleccionar o eliminar columnas

Existen varias funciones de ayuda para seleccionar columnas basándose en patrones, como contains, starts_with, ends_with, matches y num_range, basándose en una condición con where, basándose en vectores de caracteres como any_of y all_of, etc. La siguiente tabla describe las funciones más comunes y su uso.

Función Descripción
contains("texto") Selecciona columnas que contienen el texto dado
all_of(c("col1", "col2")) Selecciona todas columnas en base a un vector de caracteres
any_of(c("col1", "col2")) Selecciona columnas en base a un vector de caracteres, aunque algunas no existan
starts_with("prefijo") Selecciona columnas que comienzan con el prefijo dado
ends_with("suffijo") Selecciona columnas que terminan con el sufijo dado
last_col() Selecciona la última columna
matches("regex") Selecciona columnas que coinciden con una expresión regular
num_range("prefijo", 1:5) Selecciona columnas con un prefijo y un rango numérico en sus nombres
where() Selecciona columnas que cumplen con una condición dada, e.g. where(is.numeric) o where(is.character)
group_cols() Selecciona las columnas agrupadas con group_by
everything() Selecciona todas las columnas

contains

La función contains busca todas las columnas que contienen una cadena de texto concreta. En el siguiente ejemplo seleccionamos todas las columnas que incluyen “color” en su nombre.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Selecciona 'name' y las columnas que contienen 'color'
df_2 <- df %>%
  select(name, contains("color"))

df_2
# A tibble: 5 × 4
  name           hair_color skin_color  eye_color
  <chr>          <chr>      <chr>       <chr>    
1 Luke Skywalker blond      fair        blue     
2 C-3PO          NA         gold        yellow   
3 R2-D2          NA         white, blue red      
4 Darth Vader    none       white       yellow   
5 Leia Organa    brown      light       brown  

Función contains() en dplyr para seleccionar columnas que contienen un texto dado

Para seleccionar columnas que no contengan una cadena de texto utiliza !contains("texto") o -contains("texto").

all_of y any_of

Las funciones all_of y any_of permiten seleccionar columnas a partir de vectores de caracteres. La diferencia entre estas funciones es que all_of selecciona todas las columnas basándose en el vector y si falta alguna variable se muestra un error, mientras que any_of selecciona variables basándose en el vector sin comprobar las variables que faltan.

En el siguiente bloque de código estamos seleccionando las columnas basándonos en un vector llamado nombres_columnas usando all_of.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Columnas elegidas
nombres_columnas <- c("name", "eye_color")

df_2 <- df %>%
  select(all_of(nombres_columnas))

df_2
# A tibble: 5 × 2
  name           eye_color
  <chr>          <chr>    
1 Luke Skywalker blue     
2 C-3PO          yellow   
3 R2-D2          red      
4 Darth Vader    yellow   
5 Leia Organa    brown  

Selecciona todas las columnas a partir de un vector en R con la función all_of de dplyr

Ahora pasamos otro vector en el que hay dos nombres de columnas que no existen, pero la función any_of seleccionará aquellas columnas que sí se encuentran en el data frame e ignorará las demás.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Columnas elegidas
nombres_columnas <- c("name", "skin_color", "gender", "abc")

df_2 <- df %>%
  select(any_of(nombres_columnas))

df_2
# A tibble: 5 × 2
  name           skin_color 
  <chr>          <chr>      
1 Luke Skywalker fair       
2 C-3PO          gold       
3 R2-D2          white, blue
4 Darth Vader    white      
5 Leia Organa    light   

Seleccionar columnas a partir de un vector de caracteres en R con la función any_of de dplyr

starts_with

Si quieres seleccionar columnas que empiecen por una cadena de texto concreta puedes utilizar la función starts_with. En el siguiente ejemplo seleccionamos la variable name y todas las variables que empiecen por la letra h.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Selecciona 'name' y las columnas que empiezan por "h"
df_2 <- df %>%
  select(name, starts_with("h"))

df_2
# A tibble: 5 × 3
  name           height hair_color
  <chr>           <int> <chr>     
1 Luke Skywalker    172 blond     
2 C-3PO             167 NA        
3 R2-D2              96 NA        
4 Darth Vader       202 none      
5 Leia Organa       150 brown   

Seleccionar columnas que empiezan por una cadena de texto con la función stats_with() de dplyr

ends_with

De manera similar a la función anterior, ends_with busca las columnas que terminan con una cadena de texto específica. En el ejemplo anterior seleccionamos la primera variable (name) y todas las variables que terminan con "ss" (mass).

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Selecciona 'name' y las columnas que acaban en "ss"
df_2 <- df %>%
  select(name, ends_with("ss"))

df_2
# A tibble: 5 × 2
  name            mass
  <chr>          <dbl>
1 Luke Skywalker    77
2 C-3PO             75
3 R2-D2             32
4 Darth Vader      136
5 Leia Organa       49 

Seleccionar columnas que terminan con una cadena de texto con la función ends_with() de dplyr

last_col

La función last_col selecciona la última variable del data frame. Ten en cuenta que esta función proporciona un argumento llamado offset que por defecto es 0 para seleccionar la enésima variable desde el final.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Última columna
df_2 <- df %>%
  select(name, last_col())

df_2
# A tibble: 5 × 2
  name           eye_color
  <chr>          <chr>    
1 Luke Skywalker blue     
2 C-3PO          yellow   
3 R2-D2          red      
4 Darth Vader    yellow   
5 Leia Organa    brown   

Seleccionar la última columna de un data frame utilizando la función last_col() de dplyr

Usa !last_col() o -last_col() para seleccionar todas las columnas menos la última.

matches

La función matches selecciona columnas basándose en expresiones regulares. El siguiente bloque de código selecciona todas las columnas que contienen la letra a o la letra t.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Columnas que contienen la letra "a" o la letra "t"
df_2 <- df %>%
  select(matches("a|t"))

df_2
# A tibble: 5 × 4
  name           height  mass hair_color
  <chr>           <int> <dbl> <chr>     
1 Luke Skywalker    172    77 blond     
2 C-3PO             167    75 NA        
3 R2-D2              96    32 NA        
4 Darth Vader       202   136 none      
5 Leia Organa       150    49 brown    

Función matches() de dplyr para seleccionar columnas en base a expresiones regulares

num_range

Si tus variables se nombran con un prefijo y un rango numérico, como x1, x2, … o y_1, y_2, …, puedes utilizar la función num_range para seleccionar rápidamente un rango de columnas.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Nuevos nombres de columna
colnames(df) <- paste0("x", 1:ncol(df))

# Selecciona x1, x2 y x3
df_2 <- df %>%
  select(num_range("x", 1:3))

df_2
# A tibble: 5 × 3
  x1                x2    x3
  <chr>          <int> <dbl>
1 Luke Skywalker   172    77
2 C-3PO            167    75
3 R2-D2             96    32
4 Darth Vader      202   136
5 Leia Organa      150    49   

La función num_range del paquete dplyr

where

La función where toma una función que devuelve TRUE o FALSE como entrada y selecciona columnas basándose en la condición deseada. Por ejemplo, puedes seleccionar o eliminar todas las variables numéricas, de tipo carácter o que sean factores utilizando where(is.numeric), where(is.character) y where(is.factor), respectivamente.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

# Seleccionar todas las variables de tipo carácter
df_2 <- df %>%
  select(where(is.character))

df_2
# A tibble: 5 × 4
  name           hair_color skin_color  eye_color
  <chr>          <chr>      <chr>       <chr>    
1 Luke Skywalker blond      fair        blue     
2 C-3PO          NA         gold        yellow   
3 R2-D2          NA         white, blue red      
4 Darth Vader    none       white       yellow   
5 Leia Organa    brown      light       brown    

Seleccionar columnas numéricas, de caracteres y factores con la función where de dplyr

group_cols

La función group_cols selecciona las columnas agrupadas previamente con group_by.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

df_2 <- df %>%
  group_by(name, eye_color) %>%
  select(group_cols())

df_2
# A tibble: 5 × 2
# Groups:   name, eye_color [5]
  name           eye_color
  <chr>          <chr>    
1 Luke Skywalker blue     
2 C-3PO          yellow   
3 R2-D2          red      
4 Darth Vader    yellow   
5 Leia Organa    brown 

Seleccionar columnas agrupadas en R con la función group_cols de dplyr

everything

La función everything permite seleccionar todas las columnas. Esta función es especialmente útil cuando se combina con otras funciones de dplyr.

# install.packages("dplyr")
library(dplyr)

# Datos de ejemplo
df <- starwars[1:5, 1:6]

df_2 <- df %>%
  select(everything())

df_2
# A tibble: 5 × 6
  name           height  mass hair_color skin_color  eye_color
  <chr>           <int> <dbl> <chr>      <chr>       <chr>    
1 Luke Skywalker    172    77 blond      fair        blue     
2 C-3PO             167    75 NA         gold        yellow   
3 R2-D2              96    32 NA         white, blue red      
4 Darth Vader       202   136 none       white       yellow   
5 Leia Organa       150    49 brown      light       brown  

Seleccionar todas las variables con dplyr en R

Puedes seleccionar la intersección o unión de dos conjuntos de variables con & y |. Por ejemplo, select(starts_with("h") & ends_with("r")) selecciona todas las columnas que empiezan por la letra h y acaban por r.