2012-09-16 19 views
5

Sospetto che mi manchi qualcosa di ovvio, ma come faccio a analizzare le strutture nidificate in R usando RJSONIO?Analisi di strutture JSON profondamente nidificate in R Uso di RJSONIO

Per esempio - Suppongo che direttamente voglio fare riferimento a $ familyName in results.data.json$MRData$RaceTable$Races[[1]]$Results[[8]]$Driver come afferrato utilizzando il seguente frammento:

require(RJSONIO) 
resultsURL='http://ergast.com/api/f1/2012/1/results.json' 
results.data.json=fromJSON(resultsURL) 

RJSONIO non sembra voler analizzare i dati ..$Results[[i]] come elementi strutturati?

+0

@Maiasaura Così è la convenzione per lo stile di tutti gli elementi del codice? – psychemedia

+0

@psychmedia si. Rende più facile identificare tutti i pezzi della tua domanda, in particolare le biblioteche. – Maiasaura

risposta

3
require(RJSONIO) 

somedata1<-list(a=1,b='w') 
fromJSON(toJSON(somedata1)) 
# $a 
# [1] 1 

# $b 
# [1] "w" 

somedata2<-list(a=1,b=2) 
fromJSON(toJSON(somedata2)) 
# a b 
# 1 2 

somedata3<-list(a='v',b='w') 
fromJSON(toJSON(somedata3)) 
# a b 
# "v" "w" 

fromJSON(toJSON(somedata3),simplify=StrictNumeric) 
# $a 
# [1] "v" 

# $b 
# [1] "w" 

fromJSON(toJSON(somedata2),simplify=FALSE) 
# $a 
# [1] 1 

# $b 
# [1] 2 

fromJSON(toJSON(somedata3),simplifyWithNames = FALSE) 
# $a 
# [1] "v" 

# $b 
# [1] "w" 


fromJSON(toJSON(somedata2),simplifyWithNames = FALSE) 
# $a 
# [1] 1 

# $b 
# [1] 2 

dagli esempi precedenti per default RJSON semplifica "collezioni/matrici di elementi scalari omogenei a vettori R". Questa semplificazione può essere controllata utilizzando simplify o simplifyWithNames. Nel tuo esempio si può fare una delle seguenti operazioni per accedere all'elemento che si desidera:

require(RJSONIO) 
resultsURL='http://ergast.com/api/f1/2012/1/results.json' 
results.data.json=fromJSON(resultsURL) 
results.data.json$MRData$RaceTable$Races[[1]]$Results[[8]]$Driver['familyName'] 
# familyName 
# "Pérez" 

results.data.json=fromJSON(resultsURL,simplify=FALSE) 
results.data.json$MRData$RaceTable$Races[[1]]$Results[[8]]$Driver$familyName 
# [1] "Pérez" 

results.data.json=fromJSON(resultsURL,simplify=StrictNumeric) 
results.data.json$MRData$RaceTable$Races[[1]]$Results[[8]]$Driver$familyName 
# [1] "Pérez" 

results.data.json=fromJSON(resultsURL,simplifyWithNames = FALSE) 
results.data.json$MRData$RaceTable$Races[[1]]$Results[[8]]$Driver$familyName 
# [1] "Pérez" 
2

Il pacchetto jsonlite è un fork di RJSONIO che cerca di utilizzare una mappatura più intelligente tra le strutture di ricerca e di JSON. Penso che questo potrebbe renderti la vita più facile:

> x = fromJSON('http://ergast.com/api/f1/2012/1/results.json') 
> x$RaceTable$Races$MRData$Results[[1]]$Driver 
      driverId code             url 
1    button BUT   http://en.wikipedia.org/wiki/Jenson_Button 
2    vettel VET   http://en.wikipedia.org/wiki/Sebastian_Vettel 
3   hamilton HAM   http://en.wikipedia.org/wiki/Lewis_Hamilton 
4    webber WEB    http://en.wikipedia.org/wiki/Mark_Webber 
5    alonso ALO   http://en.wikipedia.org/wiki/Fernando_Alonso 
6   kobayashi KOB   http://en.wikipedia.org/wiki/Kamui_Kobayashi 
7   raikkonen RAI http://en.wikipedia.org/wiki/Kimi_R%C3%A4ikk%C3%B6nen 
8    perez PER  http://en.wikipedia.org/wiki/Sergio_P%C3%A9rez 
9   ricciardo RIC   http://en.wikipedia.org/wiki/Daniel_Ricciardo 
10    resta DIR   http://en.wikipedia.org/wiki/Paul_di_Resta 
11    vergne VER http://en.wikipedia.org/wiki/Jean-%C3%89ric_Vergne 
12   rosberg ROS    http://en.wikipedia.org/wiki/Nico_Rosberg 
13   maldonado MAL   http://en.wikipedia.org/wiki/Pastor_Maldonado 
14    glock GLO    http://en.wikipedia.org/wiki/Timo_Glock 
15    pic PIC    http://en.wikipedia.org/wiki/Charles_Pic 
16  bruno_senna SEN    http://en.wikipedia.org/wiki/Bruno_Senna 
17    massa MAS    http://en.wikipedia.org/wiki/Felipe_Massa 
18   kovalainen KOV  http://en.wikipedia.org/wiki/Heikki_Kovalainen 
19    petrov PET   http://en.wikipedia.org/wiki/Vitaly_Petrov 
20 michael_schumacher MSC  http://en.wikipedia.org/wiki/Michael_Schumacher 
21   grosjean GRO   http://en.wikipedia.org/wiki/Romain_Grosjean 
22   hulkenberg HUL  http://en.wikipedia.org/wiki/Nico_H%C3%BClkenberg 
23    rosa DLR   http://en.wikipedia.org/wiki/Pedro_de_la_Rosa 
24  karthikeyan KAR  http://en.wikipedia.org/wiki/Narain_Karthikeyan 
    givenName familyName dateOfBirth nationality 
1  Jenson  Button 1980-01-19  British 
2 Sebastian  Vettel 1987-07-03  German 
3  Lewis Hamilton 1985-01-07  British 
4  Mark  Webber 1976-08-27 Australian 
5 Fernando  Alonso 1981-07-29  Spanish 
6  Kamui Kobayashi 1986-09-13 Japanese 
7  Kimi Räikkönen 1979-10-17  Finnish 
8  Sergio  Pérez 1990-01-26  Mexican 
9  Daniel Ricciardo 1989-07-01 Australian 
10  Paul di Resta 1986-04-16 Scottish 
11 Jean-Éric  Vergne 1990-04-25  French 
12  Nico  Rosberg 1985-06-27  German 
13 Pastor Maldonado 1985-03-09 Venezuelan 
14  Timo  Glock 1982-03-18  German 
15 Charles   Pic 1990-02-15  French 
16  Bruno  Senna 1983-10-15 Brazilian 
17 Felipe  Massa 1981-04-25 Brazilian 
18 Heikki Kovalainen 1981-10-19  Finnish 
19 Vitaly  Petrov 1984-09-08  Russian 
20 Michael Schumacher 1969-01-03  German 
21 Romain Grosjean 1986-04-17  French 
22  Nico Hülkenberg 1987-08-19  German 
23  Pedro de la Rosa 1971-02-24  Spanish 
24 Narain Karthikeyan 1977-01-14  Indian