2017-01-28 1 views
1

Je cherche à mettre les données de cette page Web: http://live.nhl.com/GameData/20162017/2016020725/PlayByPlay.json dans une trame de données R utilisable.R - page Web json à la trame de données

J'ai essayé ce que j'ai vu jusqu'à présent en utilisant:

library(jsonlite) 
json <- "http://live.nhl.com/GameData/20162017/2016020725/PlayByPlay.json" 
doc <- fromJSON(json, simplifyDataFrame = TRUE) 

Cela met le fichier dans un list of 1 et pour être honnête, travaillant avec des listes dans R n'est pas encore une compétence de mes (plus à l'aise avec les cadres de données). Je voudrais être en mesure d'obtenir cette page Web dans une trame de données utilisable.

J'ai essayé

PBP <- rbindlist(lapply(doc, as.data.table), fill = TRUE) 

mais cela ne fonctionne pas.

Des idées? Heureux de fournir plus d'informations si nécessaire.

Répondre

3

Peut-être le premier plan d'action serait de comprendre les listes jusqu'à l'os. Ce que vous avez là est une liste de longueur 1. Si vous faites names(doc) vous remarquerez que cet élément de la liste est nommé data. Pour révéler complètement la structure de l'objet, essayez str(doc). C'est beaucoup de sortie! Voici quelques premières lignes pour vous donner une idée de ce qui se passe. Vous pouvez utiliser les listes en utilisant [[ et $. Aussi [ mais voir this tweet pour plus de détails. Vous pouvez accéder au premier élément par doc$data, doc[[1]] ou doc[["data]]. Tous sont équivalents, mais certains peuvent être plus pratiques pour certaines tâches. Pour "grimper" dans l'arborescence de la liste, ajoutez simplement des arguments supplémentaires. Notez que vous pouvez mélanger tout cela. Voir le code en ligne pour un aperçu. De votre question, on ne sait pas quelle partie du fichier json vous recherchez. Essayez d'élargir la question ou encore mieux, bricoler avec doc.

doc: 
data # doc[[1]] or doc[["data"]] pr doc$data 
|___ refreshInterval # doc[[1]][[1]] or doc[[1]][["refreshinterval"]] or doc[["data"]][["refreshinterval]] or doc$data$refreshinterval 
|___ game # doc[[1]][[2]] or doc[[1]][["game"]] or you go the idea 
     |___ awayteamid # doc$data$refreshinterval 
     |___ awayteamname 
     |___ hometeamname 
     |___ plays 
     |___ awayteamnick 
     |___ hometeamnick 
     |___ hometeamid 

Vous pouvez accéder à vos statistiques de jeu par

xy <- doc$data$game$plays$play 
xy[1:6, c("desc", "type", "p2name", "teamid", "ycoord", "xcoord")] 

               desc type   p2name teamid ycoord xcoord 
1      Radko Gudas hit Chris Kreider Hit Chris Kreider  4 -12 -96 
2 Pavel Buchnevich Wrist Shot saved by Steve Mason Shot  Steve Mason  3  26 -42 
3     Brandon Pirri hit Brandon Manning Hit Brandon Manning  3  42 -68 
4     Nick Cousins hit Adam Clendening Hit Adam Clendening  4  35  92 
5 Nick Cousins Wrist Shot saved by Henrik Lundqvist Shot Henrik Lundqvist  4  19  86 
6 Michael Grabner Wrist Shot saved by Steve Mason Shot  Steve Mason  3  5 -63 
+0

Merci pour votre réponse. Ce qui m'intéresse c'est de lire toutes les lignes json par col name dans un frame de données. – gav

+0

Il n'est pas tout à fait clair pour moi ce que représente un «json lines by col name» dans ce cas. Essayez d'étudier la structure de la sortie et dites-nous à quoi ressemble la sortie attendue. –

+0

Je suis désolé, c'est un peu obtus, je suppose que je ne sais pas comment poser cette question correctement. À son niveau le plus simple, à ce lien: [link] (https://statsapi.web.nhl.com/api/v1/game/2016020679/feed/live?site=en_nhl) Si je pouvais obtenir les données avec 'event: Missed Shot' avec des colonnes pour xcoord, ycoord et periodTime, je serais en affaires. Encore merci pour votre patience et votre aide. – gav