![](/img/trans.png)
[英]readr (or other packages from tidyverse) with data.frame instead of tibble
[英]Using tidyverse to “unnest” a data.frame column inside a tibble
我正在處理從 www 調用返回的一些數據, jsonlite
和as_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.