[解決済み] XMLをRデータフレームにパースする方法
2022-11-07 02:13:02
質問
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
関連
-
[解決済み] Rの再現性のある優れた例題の作り方
-
[解決済み] PHPでHTML/XMLをパースして処理する方法とは?
-
[解決済み] データフレームを結合(マージ)する方法(内側、外側、左側、右側)
-
[解決済み] データフレームの行を複数の列でソート(並び替え)する。
-
[解決済み] XMLの<![CDATA[]]>は何を意味するのですか?
-
[解決済み] XMLを解析して、特定のノード属性のインスタンスをカウントするには?
-
[解決済み] XML文書でエスケープする必要がある文字は何ですか?
-
[解決済み] データフレーム列の名前によるドロップ
-
[解決済み] XMLでタグのブロックをコメントアウトするにはどうすればよいですか?
-
[解決済み] XML スキーマ。テキストのみを含む属性を持つ要素?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
SAXParseException: ルート要素に続くドキュメント内のマークアップは、うまく処理されなければなりません。
-
[解決済み] XML文字列を辞書に変換する方法は?
-
[解決済み] Googles IMPORTXMLが「インポートされたコンテンツは空です」エラーを返す
-
[解決済み] コマンドラインからXMLをきれいに印刷する方法は?
-
[解決済み] 大容量ファイルを扱える軽量なXMLビューア【終了しました
-
[解決済み] XML スキーマ。テキストのみを含む属性を持つ要素?
-
[解決済み] xmlのCDATAエンドトークンをエスケープする方法はありますか?
-
[解決済み] Ubuntu 11.04でRパッケージがインストールできない [非公開]
-
[解決済み] XMLは大文字と小文字を区別するのですか?
-
[解決済み] Vim インデント xml ファイル