当前位置: 首页 > 知识库问答 >
问题:

如何解析XML到R数据帧

邵君植
2023-03-14

我试着把XML解析成R数据帧,这个链接帮了我大忙:

如何从xml文件创建R数据帧

但我还是没有弄清楚我的问题:

下面是我的代码:

data <- xmlParse("http://forecast.weather.gov/MapClick.php?lat=29.803&lon=-82.411&FcstType=digitalDWML")
xmlToDataFrame(nodes=getNodeSet(data1,"//data"))[c("location","time-layout")]
step1 <- xmlToDataFrame(nodes=getNodeSet(data1,"//location/point"))[c("latitude","longitude")]
step2 <- xmlToDataFrame(nodes=getNodeSet(data1,"//time-layout/start-valid-time"))
step3 <- xmlToDataFrame(nodes=getNodeSet(data1,"//parameters/temperature"))[c("type="hourly"")]

我想要的数据帧是这样的:

latitude  longitude   start-valid-time   hourly_temperature
29.803     -82.411  2013-06-19T15:00:00-04:00    91
29.803     -82.411  2013-06-19T16:00:00-04:00    90

我被XMLToDataFrame()困住了,任何帮助都将非常感谢,谢谢。

共有2个答案

申奇希
2023-03-14

为了性能和清晰度,更直接地使用xpath。

time_path <- "//start-valid-time"
temp_path <- "//temperature[@type='hourly']/value"

df <- data.frame(
    latitude=data[["number(//point/@latitude)"]],
    longitude=data[["number(//point/@longitude)"]],
    start_valid_time=sapply(data[time_path], xmlValue),
    hourly_temperature=as.integer(sapply(data[temp_path], as, "integer"))

导致

> head(df, 2)
  latitude longitude          start_valid_time hourly_temperature
1    29.81    -82.42 2014-02-14T18:00:00-05:00                 60
2    29.81    -82.42 2014-02-14T19:00:00-05:00                 55
马峻
2023-03-14

XML格式的数据很少以允许XMLToDataFrame函数工作的方式组织。您最好提取列表中的所有内容,然后将列表绑定到一个数据帧中:

require(XML)
data <- xmlParse("http://forecast.weather.gov/MapClick.php?lat=29.803&lon=-82.411&FcstType=digitalDWML")

xml_data <- xmlToList(data)

在示例数据中,获取位置和开始时间相当简单:

location <- as.list(xml_data[["data"]][["location"]][["point"]])

start_time <- unlist(xml_data[["data"]][["time-layout"]][
    names(xml_data[["data"]][["time-layout"]]) == "start-valid-time"])

温度数据要复杂一点。首先,您需要到达包含温度列表的节点。然后,您需要提取两个列表,在每个列表中查找,并选择一个具有“hourly”作为其值之一的列表。然后只需要选择该列表,但只保留具有“value”标签的值:

temps <- xml_data[["data"]][["parameters"]]
temps <- temps[names(temps) == "temperature"]
temps <- temps[sapply(temps, function(x) any(unlist(x) == "hourly"))]
temps <- unlist(temps[[1]][sapply(temps, names) == "value"])

out <- data.frame(
  as.list(location),
  "start_valid_time" = start_time,
  "hourly_temperature" = temps)

head(out)
  latitude longitude          start_valid_time hourly_temperature
1    29.81    -82.42 2013-06-19T16:00:00-04:00                 91
2    29.81    -82.42 2013-06-19T17:00:00-04:00                 90
3    29.81    -82.42 2013-06-19T18:00:00-04:00                 89
4    29.81    -82.42 2013-06-19T19:00:00-04:00                 85
5    29.81    -82.42 2013-06-19T20:00:00-04:00                 83
6    29.81    -82.42 2013-06-19T21:00:00-04:00                 80
 类似资料:
  • XML 服务 实体 存储库 我有一个错误: 创建在类路径资源[org/springframework/boot/autoconfigure/orm/jpa/hibernatejbaconfiguration.class]中定义的名为“entityManagerFactory”的bean时出错:初始化方法调用失败;嵌套的异常是javax。坚持不懈PersistenceException:[Persi

  • 问题内容: 如何解析包含数据的XML 我们如何解析xml并获取包含在???中的数据? 问题答案: (http://www.java2s.com/Code/Java/XML/GetcharacterdataCDATAfromxmldocument.htm)

  • 主要内容:本节引言:,1.XML数据要点介绍,2.三种解析XML方法的比较,3.SAX解析XML数据,4.DOM解析XML数据,5.PULL解析XML数据,6.代码示例下载:,本节小结:本节引言: 前面两节我们对Android内置的Http请求方式:HttpURLConnection和HttpClient,本来以为OkHttp 已经集成进来了,然后想讲解下Okhttp的基本用法,后来发现还是要导第三方,算了,放到进阶部分 吧,而本节我们来学习下Android为我们提供的三种解析XML数据的方案!

  • 我有一个. xml文件,具有以下数据: 我试图通过配置单元来解析xml,方法是使用serde在hdfs上的xml文件上创建外部表。请在下面找到我的代码 我先加了罐子 我得到的错误是 执行错误,返回代码1从org.apache.hadoop.hive.ql.exec.DDLTask. org/apache/hadoop/hive/serde2/SerDe(state=08S01, code=1) 我

  • 问题 你想从一个简单的XML文档中提取数据。 解决方案 可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据。 为了演示,假设你想解析Planet Python上的RSS源。下面是相应的代码: from urllib.request import urlopen from xml.etree.ElementTree import parse # Download

  • 我试图解析通过api调用获取的xml数据。我可以使用file\u get\u内容来读取字符串,但simpleXML\u load\u字符串似乎无法读取它。我可以将它保存到一个文件中,然后simpleXML\u load\u文件工作。但我宁愿不把内容写入文件。我似乎也不明白如何使用DOM或XMLParse。我不熟悉PHP和解析XML。api调用的输出数据如下所示。 我发现问题在于我在浏览器中看到的实