使用带有NULL值的tidyr unexst

时间:2017-11-10 14:19:30

标签: r tidyr unnest

我将一个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)

给出所需的输出。

1 个答案:

答案 0 :(得分:11)

我们可以在map_lgl使用purrr。如果您不关心那些NULL的行,则可以使用filterunnest删除它们:

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)
)