将具有嵌套列表的列表转换为具有嵌套数据帧的单行tibble

时间:2018-02-26 04:46:24

标签: r tibble

我正在尝试将通过API检索并通过jsonlite转换为列表的对象转换为单行tibble(即,列表中的每个项目都成为tibble中的变量)。

复杂的是,除了一组单独的值之外,嵌套在对象中的最终项是一个对象数组,jsonlite转换为两个列表的列表,每个列表包含两个项(我使用simplifyDataFrame = FALSE)。

在下面的代表中使用了类似于实际API数据的简化结构。

library(tidyverse)

dat <- list(
  id = 1,
  name = "Jo Bloggs",
  offices = list(
    list(office_id = 999, title = "Vice President"),
    list(office_id = 998, title = "Director of Operations")
  )
)

df <- dat %>% as_tibble()
df
#> # A tibble: 2 x 3
#>      id name      offices   
#>   <dbl> <chr>     <list>    
#> 1  1.00 Jo Bloggs <list [2]>
#> 2  1.00 Jo Bloggs <list [2]>

reprex package(v0.2.0)创建于2018-02-26。

使用as_tibble()进行转换会产生一个两行数据框,复制所有非嵌套值,两个嵌套列表各自位于一个单独的行上。

我应该更改哪些内容,而不是这样,我最终得到一行数据,最后一列包含一个嵌套的2 x 2数据帧/ tibble?提前谢谢。

1 个答案:

答案 0 :(得分:2)

您可以使用mutate更改办事处列。

res1 <- df %>% mutate(offices = list(bind_rows(map(offices,as.tibble))))
> res1
# A tibble: 2 x 3
     id name      offices         
  <dbl> <chr>     <list>          
1     1 Jo Bloggs <tibble [2 x 2]>
2     1 Jo Bloggs <tibble [2 x 2]>

以下是变异过程:

  1. 首先将as.tibble应用于办公室的每个元素。
  2. bind_rows所有单独的tibble
  3. 最后,确保office列是列表类型。
  4. 您会发现两个2x2元素是相同的。所以我们只需要删除重复的行(这里我只将id列作为唯一键)。

    res <- res1[!duplicated(res1[1]),]
    > res
    # A tibble: 1 x 3
         id name      offices         
      <dbl> <chr>     <list>          
    1     1 Jo Bloggs <tibble [2 x 2]>