2017-07-21 5 views
0

Ich bin neu mit XML-Datenbank.Analysieren von XML zu DATENRAHMEN

Ich würde versuchen, mein Problem zu erklären.

Es gibt eine Datenbank in einer XML-Datei von einer mexikanischen Regierungsseite, die ich herunterladen möchte, um sie für meine Analyse zu verwenden.

Die Seite, wo Sie die Daten finden können, ist dies.

https://datos.gob.mx/busca/dataset/estaciones-de-servicio-gasolineras-y-precios-comerciales-de-gasolina-y-diesel

Der direkte Download-Link ist das, glaube ich, wie ein externes Repository ist. Mit freundlichen Grüßen weiß ich nicht.

https://publicacionexterna.azurewebsites.net/publicaciones/prices

Wenn Sie auf den Link klicken, wird die Datenbank im XML-Format automatisch heruntergeladen.

Die Datenbank ist über mexikanische Gaspreise von Einzelhandelsverkäufern mit seinem Standort in Dezimalgraden über das Land.

Ich kann die Datenbank herunterladen und in eine Windows .xls-Datei und dann ein .csv-Archiv einfügen und dann zu meiner R-Umgebung für die Analyse.

Das allgemeine Problem ist, wenn ich versuche, direkt von der Seite in meine R-Umgebung zu downloaden Ich bin nicht in der Lage, ein strukturiertes Datenbankformat zu erhalten, das mir erlaubt, die Analyse durchzuführen.

Ich erhalte doppelte Zeilen und kann nicht alle Attribute für jede Ebene der Daten extrahieren.

Dies ist das Skript, das ich selbst schreiben konnte und im Internet nach Hilfe suchte.

# CRE FILES 

library(easypackages) 

my_packages <- c("rlist","readr", "tidyverse", "lubridate", "stringr", 
"rebus", "stringi", "purrr", "geosphere", "XML", "RCurl", "plyr") 

libraries(my_packages) 

# Link de descarga de documentos 

link1 <-(https://publicacionexterna.azurewebsites.net/publicaciones/prices") 

# First we load the xml file to the enviroment 

data_prices <- getURL(link1) 

xmlfile <- xmlParse(data_prices) 

class(xmlfile) 

xmltop <- xmlRoot(xmlfile) 

base <- ldply(xmlToList(xmltop),data.frame) 

Das Problem ist, dass ich das Datum als eine andere Spalte möchte, nicht als Folge. Danke für deine Antworten.

+0

Sie wahrscheinlich mehr Hilfe bekommen würden, wenn Sie mit der Arbeit geschrieben, minimal R Code – hrbrmstr

+0

Oh sorry, ich dachte, dass mit dem Code, den ich genug gesetzt war, ich weiß nicht, wie zu erklären, aber ich würde versuchen. –

Antwort

0

So etwas sollte Sie einen Datenrahmen mit allen Daten in separaten Spalten erhalten.

library(RCurl) 
library(XML) 

# Set link to website 
link1 <-("https://publicacionexterna.azurewebsites.net/publicaciones/prices") 

# Get data from webpage 
data_prices <- getURL(link1) 

# Parse XML data 
xmlfile <- xmlParse(data_prices) 

# Get place nodes 
places <- getNodeSet(xmlfile, "//place") 

# Get values for each place 
values <- lapply(places, function(x){ 
          # Get current place id 
          pid <- xmlAttrs(x) 

          # Get values for each gas type for current place 
          newrows <- lapply(xmlChildren(x), function(y){ 
                   # Get type and update time values 
                   attrs <- xmlAttrs(y) 

                   # Get price value 
                   price <- xmlValue(y) 
                   names(price) <- "price" 

                   # Return values 
                   return(c(pid, attrs, price)) 
                  }) 
          # Combine rows to single list 
          newrows <- do.call(rbind, newrows) 

          # Return rows 
          return(newrows) 
         }) 

# Combine all values into a single dataframe 
df <- as.data.frame(do.call(rbind, values), stringsAsFactors = FALSE) 

# Reset row names for dataframe 
row.names(df) <- c(1:nrow(df)) 
+0

Nun, das war einfach unglaublich, ich habe gestern den ganzen Tag versucht genau das zu tun. Wenn Sie ein Tutorial oder Empfehlungen zu diesem Thema haben. Vielen Dank @Matt. Das war eine großartige Antwort. –