我正在尝试将通过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?提前谢谢。
答案 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]>
以下是变异过程:
bind_rows
所有单独的tibble 您会发现两个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]>