将带有嵌套列表的列表转换为带有嵌套数据框的单行小标题

Posted

技术标签:

【中文标题】将带有嵌套列表的列表转换为带有嵌套数据框的单行小标题【英文标题】:Convert list with nested lists to one-row tibble with nested dataframe 【发布时间】:2018-02-26 04:46:23 【问题描述】:

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

复杂之处在于,除了一组单独的值之外,嵌套在对象中的最后一项是对象数组,jsonlite 将其转换为两个列表的列表,每个列表包含两个项(我使用了 simpleDataFrame = 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 年 2 月 26 日创建。

使用 as_tibble() 进行转换会生成一个包含所有非嵌套值的两行数据框,其中两个嵌套列表分别位于单独的一行。

我应该改变什么,而不是这个,我最终得到一行数据,最后一列包含一个嵌套的 2 x 2 数据框/小标题?提前致谢。

【问题讨论】:

我想您想先修改列表、办公室并创建一个 tibble 或数据框。 purrr::transpose(dat$offices) %&gt;% lapply(unlist) %&gt;% as_tibble 会给你一个 2x2 的小标题。 【参考方案1】:

您可以使用mutate 更改office 列。

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

这里是变异过程:

    首先将 as.tibble 应用于 office 的每个元素。 bind_rows所有个人小标题 最后,确保 office 列是列表类型。

你会发现这两个 2x2 的 tibbles 是一样的。所以我们只需要删除重复的行(这里我只是将 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]>

【讨论】:

以上是关于将带有嵌套列表的列表转换为带有嵌套数据框的单行小标题的主要内容,如果未能解决你的问题,请参考以下文章

递归遍历带有列表的嵌套字典,并替换匹配的值

将字符串转换为列表并嵌套在data.table中

带有字典、列表和 If 语句的嵌套循环

Python:带有字符串列表和子字典的嵌套字典

绑定嵌套列表中存在的小标题行

如何将带有嵌套字典的列表写入 csv 文件?