R Проблема с вложенным списком JSON и неуникальными именами

#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