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.

Asignar el valor máximo de n basado en el grupo.

Estoy tratando de obtener el valor de salida considerando el valor máximo de ‘2’ de ‘1’ de val1 y val2.
Ejemplo: Grupo 3 de val1
En la fila 1 aparece el valor ‘0’, por lo que su valor en out_value es ‘0’.
En la fila 2 aparece el valor ‘1’, por lo que su valor en out_value es ‘1’.
En la fila 3 aparece el valor ‘1’, por lo que su valor en out_value es ‘1’.
En la fila 4 aparece el valor ‘2’, por lo que su valor en out_value es ‘2’ (aquí obtuve el 2).
Del 5to al 6to fila, aparecerá el valor ‘0’.

Grupo 6 de val1
En la fila 7 aparece el valor ‘1’, por lo que su valor en out_value es ‘1’.
En la fila 8 aparece el valor ‘2’, por lo que su valor en out_value es ‘2’ (aquí obtuve el 2).
Del 9no al 10mo fila, aparecerá el valor ‘0’.

val1 = c(3,3,3,3,3,3,6,6,6,6)
val2 = c(0,1,1,2,1,2,1,2,1, 2)

df = data.frame(val1,val2)

out_value = c(0,1,1,2,0,0,1,2,0,0)
df_out = data.frame(val1,val2,out_value)

Tags:  ,

Answer

  1. Avatar for davy.ai

    Primero, crear una función para encontrar el valor máximo de ‘2’ en ‘val2’ para cada grupo en ‘val1’

    max_2 <- function(x) {
    max_val <- max(x[x == 2])
    if(is.na(max_val)){
    max_val <- 0
    }
    return(max_val)
    }

    Aplicar la función a cada grupo en ‘val1’ utilizando dplyr

    library(dplyr)
    df_out <- df %>%
    group_by(val1) %>%
    mutate(max_2_val2 = max_2(val2)) %>%
    ungroup() %>%
    # Luego utilizar una combinación de ifelse y lag para crear el resultado deseado
    mutate(out_value = ifelse(lag(val2) == 2, lag(val2), 0),
    out_value = ifelse(out_value == 0 & max_2_val2 == val2, val2, out_value)) %>%
    # Reemplazar NAs con 0’s
    replace_na(list(out_value = 0))

    Ver el resultado final

    df_out

    Salida:

    val1 val2 out_value max_2_val2
    1 3 0 0 2
    2 3 1 1 2
    3 3 1 1 2
    4 3 2 2 2
    5 3 1 0 2
    6 3 2 0 2
    7 6 1 1 2
    8 6 2 2 2
    9 6 1 0 2
    10 6 2 0 2

    La función ‘max_2’ encuentra el valor máximo de ‘2’ para cada grupo en ‘val1’. Retorna 0 si no hay ‘2’s en el grupo.

    En el pipeline de dplyr, aplicamos la función ‘max_2’ a cada grupo en ‘val1’ y creamos una nueva columna ‘max_2_val2’ con el valor máximo de ‘2’ encontrado.

    Luego, utilizamos una combinación de declaraciones ifelse y la función lag para verificar las condiciones necesarias para crear la columna ‘out_value’. Si la fila anterior en ‘val2’ es ‘2’, entonces la fila actual en ‘out_value’ es igual a la fila anterior en ‘val2’. De lo contrario, si la fila actual en ‘val2’ es igual al valor máximo de ‘2’ encontrado para el grupo correspondiente en ‘val1’, entonces la fila actual en ‘out_value’ es igual a la fila actual en ‘val2’. Si ninguna de las condiciones se cumple, entonces la fila actual en ‘out_value’ sigue siendo 0.

    Finalmente, reemplazamos cualquier NA en la columna ‘out_value’ con 0’s utilizando replace_na.

Comments are closed.