在带有列表列的小标题中,我如何替换<NULL>
带有嵌套的条目NA
(这将采用嵌套形式<lgl [1]>
)?
library(tibble)
tbl_with_null <-
tibble(letter = letters[1:10],
value_1 = list(1, 2, 4, data.frame(a = 1, 2, 3), NULL, 6, 7, c(8, 11, 25), NULL, 10),
value_2 = list("A", "B", "C", "D", NULL, NULL, NULL, list("H", "B", list(data.frame(id = 1:3))), "I", "J"))
> tbl_with_null
## # A tibble: 10 x 3
## letter value_1 value_2
## <chr> <list> <list>
## 1 a <dbl [1]> <chr [1]>
## 2 b <dbl [1]> <chr [1]>
## 3 c <dbl [1]> <chr [1]>
## 4 d <df[,3] [1 x 3]> <chr [1]>
## 5 e <NULL> <NULL>
## 6 f <dbl [1]> <NULL>
## 7 g <dbl [1]> <NULL>
## 8 h <dbl [3]> <list [3]>
## 9 i <NULL> <chr [1]>
## 10 j <dbl [1]> <chr [1]>
有没有办法对整个tbl_with_null
取代<NULL>
with NA
to get:
## # A tibble: 10 x 3
## letter value_1 value_2
## <chr> <list> <list>
## 1 a <dbl [1]> <chr [1]>
## 2 b <dbl [1]> <chr [1]>
## 3 c <dbl [1]> <chr [1]>
## 4 d <df[,3] [1 x 3]> <chr [1]>
## 5 e <lgl [1]> <- NA <lgl [1]> # <- NA
## 6 f <dbl [1]> <lgl [1]> # <- NA
## 7 g <dbl [1]> <lgl [1]> # <- NA
## 8 h <dbl [3]> <list [3]>
## 9 i <lgl [1]> <- NA <chr [1]>
## 10 j <dbl [1]> <chr [1]>
UPDATE
我取得了一些进展这个解决方案 https://community.rstudio.com/t/recode-values-of-a-list-column/1570/4?u=emman:
tbl_with_null %>%
mutate(across(c(value_1, value_2), ~replace(., !lengths(.), list(NA))))
## # A tibble: 10 x 3
## letter value_1 value_2
## <chr> <list> <list>
## 1 a <dbl [1]> <chr [1]>
## 2 b <dbl [1]> <chr [1]>
## 3 c <dbl [1]> <chr [1]>
## 4 d <df[,3] [1 x 3]> <chr [1]>
## 5 e <lgl [1]> <lgl [1]>
## 6 f <dbl [1]> <lgl [1]>
## 7 g <dbl [1]> <lgl [1]>
## 8 h <dbl [3]> <list [3]>
## 9 i <lgl [1]> <chr [1]>
## 10 j <dbl [1]> <chr [1]>
However,这是不够的,因为我正在寻找一个解决方案blindly代替NULL
with NA
跨越整个数据框。如果我们一起去mutate(across(everything(), ~replace(., !lengths(.), list(NA))))
我们知道letters
列也变成了列表列,这是无意的。
## # A tibble: 10 x 3
## letter value_1 value_2
## <list> <list> <list>
## 1 <chr [1]> <dbl [1]> <chr [1]>
## 2 <chr [1]> <dbl [1]> <chr [1]>
## 3 <chr [1]> <dbl [1]> <chr [1]>
## 4 <chr [1]> <df[,3] [1 x 3]> <chr [1]>
## 5 <chr [1]> <lgl [1]> <lgl [1]>
## 6 <chr [1]> <dbl [1]> <lgl [1]>
## 7 <chr [1]> <dbl [1]> <lgl [1]>
## 8 <chr [1]> <dbl [3]> <list [3]>
## 9 <chr [1]> <lgl [1]> <chr [1]>
## 10 <chr [1]> <dbl [1]> <chr [1]>
UPDATE 2
我以为我已经完成了
mutate(across(everything(), ~simplify(replace(., !lengths(.), list(NA)))))
但不幸的是,这在某些情况下会失败,例如以下数据:
tbl_with_no_null <-
tbl_with_null %>%
slice(8) %>%
select(letter, value_1)
## # A tibble: 1 x 2
## letter value_1
## <chr> <list>
## 1 h <dbl [3]>
当我期待的时候
tbl_with_no_null %>%
mutate(across(everything(), ~simplify(replace(., !lengths(.), list(NA)))))
会返回同样的结果tbl_with_no_null
(因为没有<NULL>
取代):
## # A tibble: 1 x 2
## letter value_1
## <chr> <list>
## 1 h <dbl [3]>
但我却得到了错误:
Error: Problem with `mutate()` input `..1`.
x Input `..1` can't be recycled to size 1.
i Input `..1` is `(function (.cols = everything(), .fns = NULL, ..., .names = NULL) ...`.
i Input `..1` must be size 1, not 3.
底线
我正在寻找一种替代方法<NULL>
with NA
在列表列中,当然,如果没有<NULL>
替换,然后按原样返回输入。