2016-04-06 30 views
0
library(RCurl) 
library(rjson) 
json <- getURL('https://extraction.import.io/query/runtime/17d882b5-c118-4f27-8ce1-90085ec0b116?_apikey=d5a8a01e20174e95887dc0f385e4e3f6d7ef5ca1428d5a029f2aa352509948ade8e5d7fb0dc941f4769a32b541ca6b38a7cd6578dfd81b357fbc4f2e008f5154f1dbfcff31878798fa887b70b1ff59dd&url=http%3A%2F%2Fwww.numbeo.com%2Fcost-of-living%2Fcompare_cities.jsp%3Fcountry1%3DSingapore%26country2%3DAustralia%26city1%3DSingapore%26city2%3DMelbourne') 
obj <- fromJSON(json) 

Ich möchte die Daten in schöne Spalten von Daten erhalten, aber viele Schritte in der Liste sind "namenlos". Irgendeine Idee, wie man die Daten organisiert?Extrahieren von Daten aus der Liste in R

+0

Sind Sie der Eigentümer dieses Datensatzes? Der JSON verfügt über unnötige Arrays und Schlüssel. Darf ich einige Verbesserungen vorschlagen? – pauljeba

Antwort

1

Überprüfen Sie diesen Unterschied, und lassen Sie mich wissen, was Sie denken. So sieht Ihr Objekt aus:

library(RCurl) 
library(rjson) 
json <- getURL('https://extraction.import.io/query/runtime/17d882b5-c118-4f27-8ce1-90085ec0b116?_apikey=d5a8a01e20174e95887dc0f385e4e3f6d7ef5ca1428d5a029f2aa352509948ade8e5d7fb0dc941f4769a32b541ca6b38a7cd6578dfd81b357fbc4f2e008f5154f1dbfcff31878798fa887b70b1ff59dd&url=http%3A%2F%2Fwww.numbeo.com%2Fcost-of-living%2Fcompare_cities.jsp%3Fcountry1%3DSingapore%26country2%3DAustralia%26city1%3DSingapore%26city2%3DMelbourne') 
obj <- rjson::fromJSON(json) 
str(obj) 

List of 2 
$ extractorData:List of 3 
    ..$ url  : chr "http://www.numbeo.com/cost-of-living/compare_cities.jsp?country1=Singapore&country2=Australia&city1=Singapore&city2=Melbourne" 
    ..$ resourceId: chr "b1250747011ee774e7c881617c86a5a9" 
    ..$ data  :List of 1 
    .. ..$ :List of 1 
    .. .. ..$ group:List of 52 
    .. .. .. ..$ :List of 6 
    .. .. .. .. ..$ COL VALUE  :List of 1 
    .. .. .. .. .. ..$ :List of 1 
    .. .. .. .. .. .. ..$ text: chr "Meal, Inexpensive Restaurant" 

In der Tat eine Menge Listen zwischen da, die Sie nicht brauchen. Jetzt versuchen die fromJSON Funktion jsonlite Paket:

library(jsonlite) 
obj2<- jsonlite::fromJSON(json) 

List of 2 
$ extractorData:List of 3 
    ..$ url  : chr "http://www.numbeo.com/cost-of-living/compare_cities.jsp?country1=Singapore&country2=Australia&city1=Singapore&city2=Melbourne" 
    ..$ resourceId: chr "b1250747011ee774e7c881617c86a5a9" 
    ..$ data  :'data.frame': 1 obs. of 1 variable: 
    .. ..$ group:List of 1 
    .. .. ..$ :'data.frame': 52 obs. of 6 variables: 
    .. .. .. ..$ COL VALUE  :List of 52 
    .. .. .. .. ..$ :'data.frame': 1 obs. of 1 variable: 
    .. .. .. .. .. ..$ text: chr "Meal, Inexpensive Restaurant" 
    .. .. .. .. ..$ :'data.frame': 1 obs. of 1 variable: 
    .. .. .. .. .. ..$ text: chr "Meal for 2 People, Mid-range Restaurant, Three-course" 
    .. .. .. .. ..$ :'data.frame': 1 obs. of 1 variable: 

Noch aber diese JSON einfach nicht hübsch ist, müssen wir dieses Problem beheben. Ich nehme an, Sie wollen diesen Datenrahmen drin haben. Beginnen Sie also mit

df <- obj2$extractorData$data$group[[1]] 

und es gibt Ihren Datenrahmen. Problem jedoch: Jede einzelne Zelle ist hier in einer Liste. Wenn Sie NULL-Werte hinzufügen und diese nicht einfach aufheben können, verschwinden sie und die Spalten, in denen sie stehen, werden kürzer ...

Bearbeiten: So behandeln Sie die Spalten mit list(NULL) Werten.

df[sapply(df[,2],is.null),2] <- NA 
df[sapply(df[,3],is.null),3] <- NA 
df[sapply(df[,4],is.null),4] <- NA 
df[sapply(df[,5],is.null),5] <- NA 
df2 <- sapply(df, unlist) %>% as.data.frame 

Es kann sicherlich eleganter geschrieben werden, aber das wird Sie in Gang bringen und es ist verständlich.

Verwandte Themen