¿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()
¿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:
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.
davy.ai
Para reemplazar todas las celdas NULL de un tibble con NA, podemos utilizar la función
if_else()
del paquetedplyr
. 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, .))
Tenga en cuenta que la columna
x
sigue siendo una lista, pero el valor nulo ha sido reemplazado por unNA
de longitud 1. Si desea convertir esto en una lista de longitud 1, puede utilizarmap()
:{r}
df_new <- df_new %>%
mutate(x = map(x, ~ if_else(is.na(.), NULL, .)))
Ahora la columna
x
es una lista de longitud 1 conNA
como su único elemento:“`{r}
df_new
Un tibble: 2 x 2
x y 2 </int[1]>
</int[1]>
1 <int[1]> 1
2
“`