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)
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.