我正在嘗試讀取許多 XML 檔案并將其轉換為 R 資料幀(或者最好是 Tibbles)。
不幸的是,當我嘗試使用內置函式(例如 XML 包中的 xmltodataframe 和 xmlconvert 包中的 xml_to_df )轉換檔案時,我嘗試過的所有 R 包(XML、flatxml、xmlconvert)都失敗了,所以我必須這樣做手動使用 XML2。
這是我的一個小作業示例的問題:
# Minimal Working Example
library(tidyverse)
library(xml2)
interimxml <- read_xml("<Subdivision>
<Name>Charles</Name>
<Salary>100</Salary>
<Name>Laura</Name>
<Name>Steve</Name>
<Salary>200</Salary>
</Subdivision>")
names <- xml_text(xml_find_all(interimxml ,"//Subdivision/Name"))
salary <- xml_text(xml_find_all(interimxml ,"//Subdivision/Salary"))
names
salary
# combine in to tibble (doesn't work because of inequal vector lengths)
result <- tibble(names=names,
salary = salary)
result
rbind(names, salary)
從(編造的)XML 檔案中,您可以看到 Charles 賺了 100 美元,Laura 什么也沒賺(因為缺少條目,這里是問題所在)而 Steve 賺了 200 美元。
我希望 xml2 做的是,當查詢姓名和工資節點時,回傳一個“NA”(或零也可以),當它找到一個名字但沒有相應的工資條目時,這樣我就會得到一個很好的像這樣的表:
| 姓名 | 薪水 |
|---|---|
| 查爾斯 | 100 |
| 勞拉 | 不適用 |
| 史蒂夫 | 200 |
我知道我可以修改“xpath”以僅獲取最后一個值(對于史蒂夫),這對我沒有幫助,因為(在實際資料中)它也可能是第 100 或第 23 位缺少工資資訊的人.
[我知道工資數字是作為字符值從 xml 檔案中提取的。之后我會在列上變異(across(salary, as.double)。]
任何幫助都受到高度贊賞。非常感謝您提前。
uj5u.com熱心網友回復:
您需要更加小心地匹配姓名和薪水。基本上首先找到所有<Name>節點,然后僅檢查它們的下一個兄弟<Salary>節點是否是節點。如果不是,則回傳 NA。
nameNodes <- xml_find_all(interimxml ,"//Subdivision/Name")
names <- xml_text(nameNodes)
salary <- map_chr(nameNodes, ~xml_text(xml_find_first(., "./following-sibling::*[1][self::Salary]")))
tibble::tibble(names, salary)
# names salary
# <chr> <chr>
# 1 Charles 100
# 2 Laura NA
# 3 Steve 200
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/333103.html
上一篇:在R中回圈資料幀洗掉程序
下一篇:創建回圈以比較行并創建新變數
