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 reemplazar una celda nula por NA en un tibble?

Con un tibble, es posible tener celdas NULL con listas:

tibble(x = list(1L, NULL), y = 1:2)

que nos da como resultado:


<h1>A tibble: 2 x 2</h1> <p>x y <list> <int> 1 <int <a href="https://i.stack.imgur.com/AjSW5.png">1</a>> 1 2 <NULL> 2

que se puede explorar con View()

enter image description here

¿Cómo podríamos reemplazar todas las celdas NULL de un tibble con NA?

El resultado esperado es:

tibble(x = list(1L, NA), y = 1:2)

que produce:


<h1>A tibble: 2 x 2</h1> <p>x y <list> <int> 1 <int <a href="https://i.stack.imgur.com/AjSW5.png">1</a>> 1 2 <lgl <a href="https://i.stack.imgur.com/AjSW5.png">1</a>> 2

pero en realidad es:

enter image description here


He intentado:

is.null(df)

pero no funciona como is.na()


Luego intenté con:

map(df, function(l) map(l, function(e) if(is.null(e)) NA else e))

Pero tuve problemas para crear un nuevo tibble con ello:

do.call(as_tibble, map(df, function(l) map(l, function(e) if(is.null(e)) NA else e)))

que me da un error:

Error: Columns 1 and 2 must be named.
Use .name_repair to specify repair.
Run rlang::last_error() to see where the error occurred.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para reemplazar todas las celdas NULL de un tibble con NA, podemos utilizar la función if_else() del paquete dplyr. Aquí hay un ejemplo:

    “`{r}
    library(dplyr)

    crear el tibble

    df <- tibble(x = list(1L, NULL), y = 1:2)

    reemplazar NULL con NA usando if_else()

    df_new <- df %>%
    mutate_all(~ if_else(map_lgl(., is.null), NA, .))


    La función `map_lgl()` verifica si cada elemento de la columna es nulo, y `if_else()` reemplaza los valores nulos con NA. Aquí está el tibble resultante: ```{r} df_new # Un tibble: 2 x 2 x y <list> <int> 1 <int[1]> 1 2 <lgl [1]=""> 2

    Tenga en cuenta que la columna x sigue siendo una lista, pero el valor nulo ha sido reemplazado por un NA de longitud 1. Si desea convertir esto en una lista de longitud 1, puede utilizar map():

    {r}
    df_new <- df_new %>%
    mutate(x = map(x, ~ if_else(is.na(.), NULL, .)))

    Ahora la columna x es una lista de longitud 1 con NA como su único elemento:

    “`{r}
    df_new

    Un tibble: 2 x 2

    x y
    1 <int[1]> 1
    2 2
    “`
    </int[1]>
    </int[1]>

Comments are closed.