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.

Cómo llenar los valores NA en grupos y condicionarlos.

Estoy teniendo dificultades para averiguar cómo puedo repetir el valor para id2 cuando tiene valor = NA, y también tener el mismo date1.

Tengo el siguiente marco de datos:

test = data.frame(date1 = c("2020-11-02", "2020-11-02","2020-11-02", "2020-11-03","2020-11-04","2020-11-04"),
                  value = c(676, 676, NA, 400, 505, NA),
                  id1 = c("16-4-L", "16-3-L", "16-3-R", "16-3-F", "17-6-L", "17-1-L"),
                  id2 = c("16", "16", "16", "16", "17", "17"))

date1 value    id1 id2

1 2020-11-02   676 16-4-L  16

2 2020-11-02   676 16-3-L  16

3 2020-11-02    NA 16-3-R  16

4 2020-11-03   400 16-3-F  16

5 2020-11-04   505 17-6-L  17

6 2020-11-04    NA 17-1-L  17

y necesito lo siguiente:

> resultado

date1 value    id1 id2

1 2020-11-02   676 16-4-L  16

2 2020-11-02   676 16-3-L  16

3 2020-11-02   676 16-3-R  16

4 2020-11-03   400 16-3-F  16

5 2020-11-04   505 17-6-L  17

6 2020-11-04   505 17-1-L  17

Tenga en cuenta que id2 son diferentes, pero estoy buscando el mismo id1 en la misma fecha para usar el mismo valor.

Me gustaría hacer algo como: si el valor es NA, entonces buscamos las filas que tienen el mismo id2 y date1, luego simplemente copiamos ese valor.

¿Algún consejo sobre cómo puedo hacerlo?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes usar el paquete dplyr para lograr esto. Primero, puedes agrupar el marco de datos por id2 y date1 y luego utilizar la función coalesce para rellenar los valores NA con el primer valor no-NA en el grupo.

    library(dplyr)
    
    test %>% 
      group_by(id2, date1) %>% 
      mutate(value = coalesce(value))
    

    Esto te dará el siguiente resultado:

    #        date1 value    id1 id2
    # 1 2020-11-02   676 16-4-L  16
    # 2 2020-11-02   676 16-3-L  16
    # 3 2020-11-02   676 16-3-R  16
    # 4 2020-11-03   400 16-3-F  16
    # 5 2020-11-04   505 17-6-L  17
    # 6 2020-11-04   505 17-1-L  17
    

Comments are closed.