如何在 tibble 中用 NA 替换 NULL 单元格?

How to replace NULL cell by NA in a tibble?

使用 tibble,可以有包含列表的 NULL 单元格:

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

这给了我们:

# A tibble: 2 x 2
  x             y
  <list>    <int>
1 <int [1]>     1
2 <NULL>        2

您可以使用 View()

进行探索

我们如何用 NA 替换 tibble 的所有 NULL 单元格?

预期输出为:

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

产生:

# A tibble: 2 x 2
  x             y
  <list>    <int>
1 <int [1]>     1
2 <lgl [1]>     2

但实际上是:


我试过了:

is.null(df)

但它的行为不像 is.na()...


然后我来了:

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

但我很难用它来创造新的乐趣:

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

这给了我一个错误:

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

实现您想要的结果的tidyverse方法可能如下所示:

library(purrr)
library(tibble)
library(dplyr)

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

df %>% 
  mutate(across(where(is.list), ~ purrr::modify_if(.x, is.null, ~ NA)))
#> # A tibble: 2 × 2
#>   x             y
#>   <list>    <int>
#> 1 <int [1]>     1
#> 2 <lgl [1]>     2

我们可以用map作为

library(purrr)
library(dplyr)
df %>% 
   mutate(across(where(is.list), map, `%||%`, NA))
# A tibble: 2 × 2
  x             y
  <list>    <int>
1 <int [1]>     1
2 <lgl [1]>     2

数据

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