¿Te ha pasado que tienes tus datos casi listos para el análisis, pero hay un par de columnas o filas que necesitan un cambio final? La tentación es usar mutate()
para crear copias de estas variables y luego modificarlas 🫣…
En este post, te invito a resistir esa tentación. En lugar de crear nuevas variables con mutate()
, te invito a modificar lo que ya tienes dentro de un pipe (%>%
).
Un workflow para modificar variables
En un pipe, puedes usar la familia de funciones modify()
para modificar variables. La idea esencial de estas funciones es que le dices a R
:
Toma las siguientes columnas y modifícalas con una función.
La clave es saber cuál es la forma más eficiente de seleccionar las columnas que quieres modificar. Si son pocas columnas, puedes usar modify_at()
para declarar explícitamente las columnas que quieres seleccionar. Si son varias columnas, puedes usar modify_if()
y una condición para seleccionar columnas. Lee este artículo para más detalles sobre esta familia de funciones.
Modificando pocas variables
Por ejemplo, si quisiéramos modificar la variable sb
para que estuviera en una escala distinta, podríamos usar:
core_data %>%
modify_at(
.at = "sb",
~.x*100
)
Aquí, .at
le dice a R
qué columnas modificar y ~.x*100
representa la función que vamos a usar para modificar las variables seleccionadas. En este caso, estamos multiplicando sb
por 100
. Con esto, podemos modificar la escala de sb
, sin tener que crear una nueva variable.
La real ventaja de usar este workflow es que uno puede aplicar la misma modificación para múltiples variables al mismo tiempo:
core_data %>%
modify_at(
.at = c("sb", "threat", "ach"),
~.x*100
)
Modificando muchas variables
Claramente, modify_at()
deja de ser útil cuando la lista de variables que quieres modificar con la misma función crece exponencialmente. Por ejemplo, cuando recibes datos de otra persona en tu equipo y te das cuenta que las columnas que tú pensabas que deberían ser números, R
las considera texto (strings) o variables categóricas (factors). En este caso, puedes usar modify_if()
para seleccionar columnas usando condiciones (Lee este post si quieres más detalles sobre las condiciones).
Siguiendo este ejemplo, puedes cambiar la clase de variables que R
considera strings de la siguiente forma:
df %>%
modify_if(
is.character,
as.numeric
)
Fíjate que en este código no tenemos que usar los paréntesis que van al final de is.character()
y as.numeric()
😲. modify_if()
reconoce que le estamos dando dos funciones para declarar la selección de variables y la transformación:
Toma las columnas que son character strings y transfórmalas a números.
En el día a día, la forma más frecuente en que uso modify_if()
es para manejar la cantidad decimales de variables numéricas. Esta necesidad surge, por ejemplo, cuando estás creando la base de una tabla 📋 o figura 📊 (Lee este post). Para ello, uso el siguiente código:
core_data %>%
select(sb, minority, gender) %>%
modify_if(
is.numeric,
~round(., 2)
)
Aquí seleccionamos una variable numérica (sb
) y dos strings (minority
, gender
) para tener un df
más pequeño que ayude a ilustrar el uso de modify_if()
. Luego, le decimos a R
:
Selecciona las variables numéricas (
sb
) y usaround()
para aproximar cada valor a dos decimales.
A medida que vas aprendiendo a dominar estas funciones, te vas a dar cuenta que las condiciones que puedes usar para seleccionar variables son muchas! Lo esencial es preguntarse:
¿Hay algo en común entre las variables que quiero modificar? ¿Tienen una clase en común (ej: son numéricas o caracteres)? ¿Tienen nombres en común (ej: comienzan con los mismos caracteres)? Si son numéricas, ¿tienen características como la media en común (ej: la media es mayor a 100)?