簡體   English   中英

將帶有嵌套列表的列表轉換為帶有嵌套數據框的單行小標題

[英]Convert list with nested lists to one-row tibble with nested dataframe

我正在嘗試將通過 API 檢索並由 jsonlite 轉換為列表的對象轉換為單行小標題(即,列表中的每個項目都成為小標題中的變量)。

復雜的是,除了一組單獨的值之外,嵌套在對象中的最后一項是一個對象數組,jsonlite 將其轉換為兩個列表的列表,每個列表包含兩個項目(我使用了simpleDataFrame = FALSE)。

下面的 reprex 中使用了類似於實際 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 包(v0.2.0) 於2018年 2 月 26 日創建。

使用 as_tibble() 進行轉換會生成一個兩行數據框,復制所有非嵌套值,兩個嵌套列表分別位於單獨的行上。

我應該改變什么,而不是這樣,我最終得到一行數據,最后一列包含一個嵌套的 2 x 2 數據幀/tibble? 提前致謝。

您可以使用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]>

以下是變異過程:

  1. 首先將 as.tibble 應用於辦公室的每個元素。
  2. bind_rows所有單獨的bind_rows
  3. 最后,確保 office 列是列表類型。

您會發現兩個 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]>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM