[英]Unnest multiple columns from json
我想知道是否有更簡單的解決方案來將一些 JSON 取消嵌套到數據幀中。 我有來自 API 的以下 JSON:
library(tidyverse)
library(jsonlite)
json <- '{
"result": {
"id": "id_1",
"description": "description",
"var1": {
"var1Id": "a",
"var1Title": "aTitle"
},
"var2": {
"var1Id": "b",
"var2Title": "bTitle"
},
"var3": {
"var3Id": "c",
"var3Info": "c123",
"var3Type": "cType"
},
"var4": {
"var4Lvl2": [
{
"var4Id": "d",
"var4Title": "dTitle"
},
{
"var4Id": "d2",
"var4Title": "d2Title"
}
]
}
}
}'
接下來,我通常將其轉換為 tibble,然后開始對每個列表列使用tidyr::unnest_wider
:
## Note I use bind_rows to simulate how my actual data looks
json2 <- json %>%
fromJSON() %>%
tibble() %>%
bind_rows(fromJSON(json) %>% tibble())
json2 %>%
unnest_wider(".") %>%
unnest_wider("var1", names_sep = "_") %>%
unnest_wider("var2", names_sep = "_") %>%
unnest_wider("var3", names_sep = "_") %>%
unnest_wider("var4", names_sep = "_") %>%
unnest_wider("var4_var4Lvl2") %>%
unnest_wider("var4Id", names_sep = "_") %>%
unnest_wider("var4Title", names_sep = "_")
上面的過程工作得很好,但我覺得有一種更簡單的方法可以取消所有這些列的嵌套,而無需輸入單個列名。 請注意,列數和列名可能會根據特定的 API 查詢而變化,因此能夠處理這些變化的解決方案會很棒。
最終在這里找到了akrun 的答案。 我制作了一個函數來取消嵌套所有可以為嵌套列表列的每一層順序使用的內容。
## create unnest_all function
unnest_all <- function(data){
list_cols <- names(select(data, where(is.list)))
data_non_list <- data %>%
select(!where(is.list))
if(length(list_cols) != 0){
map_dfc(list_cols, ~
data %>%
select(.x) %>%
unnest_wider(c(!!.x), names_sep= "_", names_repair = 'unique')) %>%
bind_cols(data_non_list, .)
} else {
data %>%
janitor::clean_names()
}
}
## use on json data
json %>%
fromJSON() %>%
tibble() %>%
bind_rows(fromJSON(json) %>% tibble()) %>%
unnest_wider(".") %>%
unnest_all() %>%
unnest_all() %>%
unnest_all()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.