es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 o case_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.

Tags:  , ,

Answer

  1. Avatar for 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 columna condition representa la condición x > 2. Luego, puedes hacer referencia a condition en lugar de repetir la condición completa en tu código. Aquí tienes cómo puedes hacerlo:

    df %>%
      mutate(condition = x > 2,
             result = if_else(condition & auxiliary == "Calculation done",
                              true = x + y,
                              false = NA_real_),
             auxiliary = if_else(condition,
                                 true = "Calculation done",
                                 false = NA_character_)) %>%
      select(-condition)
    

    En este código, primero creas una nueva columna condition que representa la condición x > 2. Luego, utilizas condition en las declaraciones if_else() para documentar y calcular los resultados como antes. Finalmente, sobrescribes la columna auxiliary solo donde condition es TRUE. La parte select(-condition) simplemente elimina la columna intermedia condition del resultado.

    Esto debería darte el resultado deseado evitando la repetición de código.

Comments are closed.