簡體   English   中英

使用 tidyverse 在 tibble 中“取消嵌套” data.frame 列

[英]Using tidyverse to “unnest” a data.frame column inside a tibble

我正在處理從 www 調用返回的一些數據, jsonliteas_tibble以某種方式轉換為data.frame列。

result數據有一個Id integer 列和一個帶有兩個內部列的ActionCode data.frame 列。 這些在控制台中顯示為:

> result
# A tibble: 117 x 2
  Id    ActionCode$Code $Name 
  <int> <chr>           <chr>
  1     A1              First Code
  2     A2              Second Code
  3     A3              Third Code
  4     A4              Fourth Code
  ...

這可以用str()來檢查:

> result %>% str()
tibble [117 x 2] (S3: tbl_df/tbl/data.frame)
 $ Id : int [1:117] 1 2 3 4 ...
 $ ActionCode:'data.frame': 117 obs. of  2 variables:
  ..$ Code: chr [1:117] "A1" "A2" "A3" "A4" ...
  ..$ Name: chr [1:117] "First Code" "Second Code" "Third Code" "Fourth Code" ...

我從例如https://tibble.tidyverse.org/articles/types.html看到這種data.frame列是完全合法的,但我正在努力弄清楚如何從整潔的 dplyr 管道 - 例如我無法select(ActionCode$Code)

有沒有辦法在dplyr管道中使用這些列? 或者有沒有辦法以某種方式展平這些列,類似於在list列上使用unnest的方式(盡管我在這里意識到我沒有創建額外的行 - 我只是展平列層次結構)。

即我正在嘗試找到一個可以 output 的 function foo

> result %>% foo() %>% str()
tibble [117 x 2] (S3: tbl_df/tbl/data.frame)
 $ Id : int [1:117] 1 2 3 4 ...
 $ Code: chr [1:117] "A1" "A2" "A3" "A4" ...
 $ Name: chr [1:117] "First Code" "Second Code" "Third Code" "Fourth Code" ...

我無法提供 www 調用作為示例,但作為一個工作示例,我認為我所呈現的數據類型類似於:

sample_data <- tibble(
  Id = 1:10,
  ActionCode = tibble(
    Code = paste0("Id", 1:10),
    Name = paste0("Name ", 1:10),
  )
)

使用do.call重新轉換為data.frame

library(dplyr)
library(stringr)
do.call(data.frame, sample_data) %>% 
    rename_at(vars(starts_with('ActionCode')), ~ 
        str_remove(., 'ActionCode\\.')) %>% 
    as_tibble

-輸出

# A tibble: 10 x 3
#      Id Code  Name   
#   <int> <chr> <chr>  
# 1     1 Id1   Name 1 
# 2     2 Id2   Name 2 
# 3     3 Id3   Name 3 
# 4     4 Id4   Name 4 
# 5     5 Id5   Name 5 
# 6     6 Id6   Name 6 
# 7     7 Id7   Name 7 
# 8     8 Id8   Name 8 
# 9     9 Id9   Name 9 
#10    10 Id10  Name 10

另一個解決方案有效,但我仍然想指出data.table可以很好地自動處理這些情況:

library(tibble)

sample_data <- tibble(
  Id = 1:10,
  ActionCode = tibble(
    Code = paste0("Id", 1:10),
    Name = paste0("Name ", 1:10),
  )
)

library(data.table)
as.data.table(sample_data)
#>     Id ActionCode.Code ActionCode.Name
#>  1:  1             Id1          Name 1
#>  2:  2             Id2          Name 2
#>  3:  3             Id3          Name 3
#>  4:  4             Id4          Name 4
#>  5:  5             Id5          Name 5
#>  6:  6             Id6          Name 6
#>  7:  7             Id7          Name 7
#>  8:  8             Id8          Name 8
#>  9:  9             Id9          Name 9
#> 10: 10            Id10         Name 10

暫無
暫無

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

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