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.

R- Establecer valores por grupo basados en una condición en un marco de datos.

Tengo el siguiente conjunto de datos.

grupo valor nombrefila superposiciones
groupa 4 1 2
groupa 5 2 3, 5
groupa 48 3 4, 5
groupa 54 4 5
groupa 12 5
groupb 12 6 7
groupb 1 7

La columna “superposiciones” indica qué filas tienen cierta “superposición”.

Me gustaría, solo para las filas cuyo valor sea mayor que 10, reemplazar los datos en la columna de valor con cero para todas las filas indicadas en la respectiva columna de “superposiciones”.

Resultado esperado:

grupo valor nombrefila superposiciones
groupa 4 1 2
groupa 5 2 3, 5
groupa 48 3 4, 5
groupa 0 4 5
groupa 0 5
groupb 12 6 7
groupb 0 7

Ejemplo reproducible:

data <- data.frame(group = c(“group_a”, “group_a”, “group_a”, “group_a”,
“group_a”, “group_b”, “group_b”),
value = c(4, 5 , 48, 54, 12, 12, 1),
row_name = c(“1”, “2”, “3”, “4”, “5”, “6”, “7”),
overlaps = c(“2”, “3, 5”, “4, 5”, “5”, “”, “7”, “”))

No sé si es un problema muy complejo, pero llevo horas atascado y no he podido resolverlo.

¿Alguien tiene alguna sugerencia sobre cómo puedo resolver esto, por grupo, usando dplyr o data.table?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes utilizar dplyr para resolver este problema. Primero, puedes filtrar el data frame para incluir solo las filas con un valor mayor a 10. Luego, puedes utilizar mutate para reemplazar los valores en la columna value con 0 para todas las filas indicadas en la columna overlaps.

    library(dplyr)
    
    data %>% 
      filter(value > 10) %>% 
      mutate(value = ifelse(row_name %in% overlaps, 0, value))
    

    Esto te dará el resultado esperado:

    group value rowname overlaps
    groupa 4 1 2
    groupa 5 2 3, 5
    groupa 48 3 4, 5
    groupa 0 4 5
    groupa 0 5
    groupb 12 6 7
    groupb 0 7

Comments are closed.