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.

Mutar por un elemento de columna basándose en una condición.

Estoy tratando de mutar una columna de tal manera que:
1) El dataframe se agrupa según el error.
2) La columna mutada (treatmentToGrowthRatio) es igual a:

valor / (valor tal que el tratamiento == “Crecimiento”).

Lo que tengo:

df <- tibble(
  type = as.factor(c("bug1", "bug1", "bug1", "bug2", "bug2", "bug2", "bug3", "bug3", "bug3", "blank")),
  treatment = c(rep(c("TreatA", "TreatB", "Growth"),3), "Blank"),
  value = 1:10
)

La operación que busco:

df %>%
  group_by(bug) %>%
  mutate(
    treatmentToGrowthRatio =
      value/
      ## valor donde el tratamiento == crecimiento
      ## (es decir, para bug 1 = 3; para bug 2 = 6; para bug 3 = 9; para Blank = NA)
  )

Para obtener el resultado deseado:

dfFinal <- tibble(
  type = as.factor(c("bug1", "bug1", "bug1", "bug2", "bug2", "bug2", "bug3", "bug3", "bug3", "blank")),
  treatment = c(rep(c("TreatA", "TreatB", "Growth"),3), "Blank"),
  value = 1:10,
  treatmentToGrowthRatio = c(1/3, 2/3, 1, 4/6, 5/6, 1, 7/9, 8/9, 1, NA)
)

Lo más cercano que he llegado muestra treatmentToGrowthRatio = 1 donde Treatment == “Growth” con:

df %>% group_by(type) %>% 
  mutate(
    treatmentToGrowthRatio =
      value/
      case_when(
        str_detect(treatment,
                   "Crecimiento") ~ value
      )
  )

Aprecio cualquier idea. ¡Gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para obtener el resultado deseado, puedes utilizar el siguiente código:

    “`{r}
    dfFinal <- df %>%
    group_by(type) %>%
    mutate(treatmentToGrowthRatio = value[which(treatment == ‘Growth’)] / value)

    dfFinal$treatmentToGrowthRatio[is.na(dfFinal$treatmentToGrowthRatio)] <- NA
    “`

    Explicación:

    • Primero, agrupamos los datos según la columna “type” utilizando group_by().
    • Luego, creamos una nueva columna “treatmentToGrowthRatio” utilizando mutate().
    • Definimos la nueva columna como el valor de “value” dividido por el valor correspondiente de “value” donde la columna “treatment” es igual a “Growth”. Para hacer esto, utilizamos la función which() para encontrar el índice de la fila donde “treatment” es igual a “Growth” y luego seleccionamos la columna “value” utilizando ese índice. La división se realiza elemento a elemento porque el dataframe está agrupado.
    • Por último, reemplazamos los NA en la columna “treatmentToGrowthRatio” con NA reales (en lugar de NaN) utilizando is.na().

    ¡Esto debería darnos el resultado deseado!

Comments are closed.