Использование подстановочного знака для получения всех узлов - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь извлечь данные из файла json, используя подстановочный знак.

Данные, которые я пытаюсь получить, являются статистикой игры для каждого игрока из этого файла json. Они под

http://statsapi -default-elb-prod-876255662.us-east-1.elb.amazonaws.com / апи / v1 / игры / 565711 / boxscore

Я протестировал jsonpath с помощью этого сайта

http://jsonpath.herokuapp.com/

Если я введу этот путь JSON

команды. .players. .person.fullName

Я получаю список всех игроков

"Shane Bieber",
"Jon Edwards",
"Max Moroff",
"Jake Bauers",
"Tyler Olson",
"Nick Wittgren",
"Carlos Carrasco",
"Leonys Martin",
"Neil Ramirez",
"Greg Allen",
"Kevin Plawecki",
"Brad Miller",
"Jordan Luplow".
etc...  

Однако, когда я помещаю этот код в r, я получаю ошибку

Error: unexpected '*' in "  repos$teams$*"

я пробовал следующие коды

repos$teams$*$players$*$person$fullName
repos$teams$[*]$players$[*]$person$fullName
repos$teams$[[*]]$players$[[*]]$person$fullName

Конечная цель - собрать все статистические данные по каждому игроку в кадре данных

Может кто-нибудь указать мне правильное направление? Я новичок в JSON с R, думал, что у меня все хорошо, и это ударило меня по глазам! ха!

Спасибо!

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Вы можете попробовать использовать пакет rjsonpath . Это еще не на CRAN, но полезно здесь.

После установки вы можете сделать:

json_path(repos,  "$teams..players..person.fullName")

или, может быть, просто

json_path(repos,  "$..fullName")
0 голосов
/ 15 апреля 2019

Ни база R, ни аккуратный стих не поддерживают jsonpath. Язык R вообще не определяет * как символ подстановки. В R вы должны отобразить коллекции для извлечения значений. В R с пакетом purrr я мог бы сделать что-то вроде этого

# repos <- jsonlite::fromJSON("http://statsapi-default-elb-prod-876255662.us-east-1.elb.amazonaws.com/api/v1/game/565711/boxscore")

library(purrr)
map(repos$teams, pluck, "players") %>% 
  unlist(recursive = FALSE) %>% 
  map_chr(pluck, "person", "fullName")

Сначала я сопоставляю команды для извлечения как дома, так и на выезде, затем в каждую из этих групп я использую функцию pluck(), чтобы получить игроков. Затем я использую unlist(), чтобы объединить списки игроков из дома / в гостях. Затем я снова сопоставляю всех игроков, используя pluck(), чтобы извлечь человека $ fullName из каждого. map_chr гарантирует, что символьный вектор будет возвращен. Pluck назовет этот вектор, если вы хотите удалить имена, которые вы можете добавить %>% unname() в конце.

...