Escribiendo otras columnas cuando se cumple una condición
Me gustaría crear una columna nueva, documentarla solo cuando cumpla una condición específica (aquí x > 2
) y luego sobrescribir directamente otra columna existente (aquí auxiliary
) para aquellas filas donde la condición (x > 2
) sea verdadera.
df <- tibble(x = 1:5, y = 1:5, auxiliary = NA)
# A tibble: 5 x 3
x y auxiliary
1 1 NA
2 2 NA
3 3 NA
4 4 NA
5 5 NA
Puedo hacer esto exitosamente en dos llamadas diferentes dentro de mutate()
:
df %>%
mutate(result = if_else(condition = x > 2,
true = x+y,
false = NA_real_),
auxiliary = if_else(condition = x > 2,
true = "Cálculo realizado",
false = NA_character_))
# A tibble: 5 x 4
x y auxiliary result
1 1 NA NA
2 2 NA NA
3 3 Cálculo realizado 6
4 4 Cálculo realizado 8
5 5 Cálculo realizado 10
Pero hay repetición de código (condition = x > 2
) que, en casos más complejos, dificulta la lectura del código y aumenta la posibilidad de errores, especialmente cuando hay múltiples condiciones.
¿Hay alguna forma de simplificar el código anterior sin repetir la condición?:
- Crear una nueva variable (
mutate()
) - Documentar solo si se cumple la condición (
if_else
ocase_when()
) - Escribir el valor de otra columna solo si se cumple la condición de la fila. (Estoy atascado aquí)
Algo que se vería así:
df %>%
mutate(result = case_when(
x > 2 ~ x + y & auxiliary == "Cálculo realizado", # agregaríamos la referencia de la columna aquí...
TRUE ~ NA_real_ & auxiliary = NA_character_))
¡Muchas gracias! Cualquier solución del tidyverse sería ideal.
davy.ai
Sí, puedes simplificar el código y evitar repetir la condición utilizando la función
with()
para crear un contexto donde la columnacondition
representa la condiciónx > 2
. Luego, puedes hacer referencia acondition
en lugar de repetir la condición completa en tu código. Aquí tienes cómo puedes hacerlo:En este código, primero creas una nueva columna
condition
que representa la condiciónx > 2
. Luego, utilizascondition
en las declaracionesif_else()
para documentar y calcular los resultados como antes. Finalmente, sobrescribes la columnaauxiliary
solo dondecondition
esTRUE
. La parteselect(-condition)
simplemente elimina la columna intermediacondition
del resultado.Esto debería darte el resultado deseado evitando la repetición de código.