2014-12-11 25 views
5

Ho problemi con un JSON nidosissimo.JSON da record a frame di dati in R

Il formato è simile

{ 
    "matches": [ 
    { 
     "matchId": 1, 
     "region": "BR", 
     "participants": [ 
     { 
      "participantId": 0, 
      "teamId": 200, 
     "stats": { 
      "winner": true, 
      "champLevel": 16, 
      "item0": 3128, 
      } 
     { 
     "matchId": 2, 
     "region": "BR", 
     "participants": [ 
     { 
      "participantId": 0, 
      "teamId": 201, 
     "stats": { 
      "winner": false, 
      "champLevel": 18, 
      "item0": 3128, 
      "item1": 3157, 
      "item1": 3158, 
      } 

Come si può vedere nella seconda partita il numero di elementi aumentato, ma nel frame di dati della prima riga avranno gli stessi collumns:

MatchId region ... stats.winner stats.champLevel stats.item0 stats.item1 stats.item2 
1   BR   TRUE   16     3128   1  BR 
1   BR   TRUE   16     3128   3157  3158 

Vedere la prima riga è più piccola del secondo, quindi R riciclare i valori ....

Se si desidera ottenere i dati completi, è possibile prenderlo a: http://pastebin.com/HQDf2ase

Come analizzato il JSON per data.frame:

escludere dall'elenco gli elementi del JSON e convertirlo in un frame di dati

matchData.i <- lapply(json.matchData$matches, function(x){ unlist(x)}) 

trasformare in Data Frame

matchData <- do.call("rbind", matchData.i) 
matchData <- as.data.frame(matchData) 

Ma il dataframe è incasinato, perché alcuni campi dovrebbero essere NA ma sono pieni di wron valori g.

risposta

4

Penso che utilizzare la funzione plyrrbind.fill() sia utile qui. Che ne dite di questo

library(plyr) 
matchData <- rbind.fill(lapply(matchData.i, 
    function(x) do.call("data.frame", as.list(x)) 
)) 

il bit lapply() è quello di trasformare le liste intermedi in data.frames che rbind.fill richiede.

Problemi correlati