我将一个JSON文件转换为一个带有嵌套列表结构的data.frame,我希望将其删除并展平。列表中的某些值为NULL,不接受这些值。如果我用只有NA值的data.frame结构替换NULL值,我会得到所需的结果。
以下是我的问题的简化示例。我试图用NA data.frame替换NULL值但由于嵌套结构而无法管理。我怎样才能达到预期的效果?
实施例
library(tidyr)
input1 <- data.frame(id = c("c", "d", "e"), value = c(7, 8, 9))
input2 <- NULL
input3 <- data.frame(id = c(NA), value = c(NA))
df <- dplyr::tibble(
a = c(1, 2),
b = list(a = input1, c = input2))
unnest(df)
给出错误&#34;错误:每列必须是向量列表或数据帧列表[b]&#34;
df2 <- dplyr::tibble(
a = c(1, 2),
b = list(a = input1, c = input3))
unnest(df2)
给出所需的输出。
答案 0 :(得分:11)
我们可以在map_lgl
使用purrr
。如果您不关心那些NULL
的行,则可以使用filter
和unnest
删除它们:
library(tidyverse)
df %>%
filter(!map_lgl(b, is.null)) %>%
unnest()
#> # A tibble: 3 x 3
#> a id value
#> <dbl> <fctr> <dbl>
#> 1 1 c 7
#> 2 1 d 8
#> 3 1 e 9
如果你想保留这些行,你可以在取消后用right_join
带回来:
df %>%
filter(!map_lgl(b, is.null)) %>%
unnest() %>%
right_join(select(df, a))
#> Joining, by = "a"
#> # A tibble: 4 x 3
#> a id value
#> <dbl> <fctr> <dbl>
#> 1 1 c 7
#> 2 1 d 8
#> 3 1 e 9
#> 4 2 <NA> NA
input1 <- data.frame(id = c("c", "d", "e"), value = c(7, 8, 9))
input2 <- NULL
input3 <- data.frame(id = c(NA), value = c(NA))
df <- dplyr::tibble(
a = c(1, 2),
b = list(a = input1, c = input2)
)