1. ホーム
  2. xml

[解決済み] XMLをRデータフレームにパースする方法

2022-11-07 02:13:02

質問

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() のところで行き詰まっています。

どのように解決するのですか?

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"])

温度データはもう少し複雑です。まず、温度リストを含むノードに到達する必要があります。次に、両方のリストを抽出し、それぞれのリスト内を見て、値の 1 つとして "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