#r #json #nested-lists
#r #json #вложенные списки
Вопрос:
У меня есть глубокий вложенный список из JSON API, и я сталкиваюсь с проблемой при удалении списка из списка из-за неуникальных идентификаторов переменных в разных подсписках.
Одни и те же имена переменных означают разные вещи в разных подсписках. Подсписки представляют собой этот странный тип подсчетов (я не знаю правильного имени), что означает, что у них нет идентификаторов имен, но они доступны только через [[1]] , … и т.д. обычные операторы, такие как [1: 4] или [i], похоже, не работают в двойных скобках.
Данные поступают из API службы финансового отслеживания ООН. Что я хотел бы иметь, так это data.frame с информацией о доноре, организации-получателе, стране-получателе, общем количестве долларов США и кластере, к которому принадлежал проект для каждого потока.
library(httr)
# Load Sample Data ---------------------------------------------------------------
# Sample of 2001 (bigger dataloads need login)
res = GET("https://api.hpc.tools/v1/public/fts/flow?year=2001")
jsonRespParsed <- httr::content(res)
# The Problem ---------------------------------------------------------------
# The variables sourceObjects.names revers to names in 3 different lists and leads to different results
# Long Donor Name
jsonRespParsed$data$flows[[1]]$sourceObjects[[1]]$name
# Short Donor Name
jsonRespParsed$data$flows[[1]]$sourceObjects[[2]]$name
# Year???
jsonRespParsed$data$flows[[1]]$sourceObjects[[3]]$name
# Same for the variables destinationObjects.names
# Name of Recipient Organization
jsonRespParsed$data$flows[[1]]$destinationObjects[[1]]$name
#Cluster Name
jsonRespParsed$data$flows[[1]]$destinationObjects[[2]]$name
# Recipient Country
jsonRespParsed$data$flows[[1]]$destinationObjects[[3]]$name
# Year
jsonRespParsed$data$flows[[1]]$destinationObjects[[4]]$name
Когда я отменяю список и разделяю вложенные объекты, это оставляет меня с проблемой sourceObjects.names и destinationObjects.names. Таким образом, в основном проблема заключается в том, что при удалении из списка удаляется информация о номере подсписка, и без этого становится невозможным различать повторяющиеся имена переменных
# Unlisting the nested list ---------------------------------------------------------------
data_raw <- enframe(unlist(jsonRespParsed))
# Getting the right number of nested sublists
rgx_split <- "\."
n_cols_max <-
data_raw %>%
pull(name) %>%
str_split(rgx_split) %>%
map_dbl(~length(.)) %>%
max()
n_cols_max
# Separate into columns
nms_sep <- paste0("name", 1:n_cols_max)
data_sep <-
data_raw %>%
tidyr::separate(name, into = nms_sep, sep = rgx_split, fill = "right")
#Ideally, I would now filter the data I need, like:
data_filt <-
data_sep %>%
filter(
(
name3 == "method" )|
( name3 == "budgetYear"
)|
( name3 == "amountUSD"
)|
( name3 == "sourceObjects" amp;
name4 == "name"
)|
( name3 == "sourceObjects" amp;
name4 == "organizationTypes"
)|
( name3 == "sourceObjects" amp;
name4 == "organizationSubTypes"
)|
( name3 == "destinationObjects" amp;
name4 == "name"
)|
( name3 == "destinationObjects" amp;
name4 == "organizationTypes"
)|
( name3 == "destinationObjects" amp;
name4 == "organizationSubTypes"
)
)
Повторение имен делает невозможным создание широкого data.frame со столбцами для значений.
Пожалуйста, помогите: O
Комментарии:
1. При исследовании этого вопроса в пакете purrr была предложена функция для выполнения чего-то подобного. Пока нет четкого ответа. github.com/tidyverse/purrr/issues/525