将XML解析为数据框架

时间:2017-07-21 01:29:56

标签: r xml database plyr social

我是XML数据库的新手。

我会尝试解释我的问题。

我从墨西哥政府页面的xml文件中存储了一个数据库,我试图下载该数据库以用于我的分析。

您可以在此找到数据的页面。

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

直接下载链接是这个,我认为就像一个外部存储库。真诚的,我不知道。

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

如果单击上面的链接,将自动下载xml格式的数据库。

该数据库是关于零售商的墨西哥天然气价格,而他的位置是全国十进制度。

我能够下载数据库并粘贴到Windows .xls文件,然后粘贴到.csv存档,然后上传到我的R环境进行分析。

一般问题是,当我试图直接从页面下载到我的环境时,我无法获得允许我执行分析的结构化数据库格式。

我获取重复的行,并且无法提取每个数据级别的所有属性。

这是我自己写的脚本,并在互联网上寻求帮助。

# 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)

问题在于我希望将日期作为另一列,而不是一行。谢谢你的回答。

1 个答案:

答案 0 :(得分:1)

这样的事情会让你得到一个包含不同列中所有数据的数据框。

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))
相关问题