Рассмотрим следующий XML
пример
library(xml2)
myxml <- read_xml('
<data>
<obs ID="a">
<name> John </name>
<hobby> tennis </hobby>
<hobby> golf </hobby>
<skill> python </skill>
</obs>
<obs ID="b">
<name> Robert </name>
<skill> R </skill>
</obs>
</data>
')
Здесь я хотел бы получить кадр данных (R или Pandas) из этого XML, который содержит столбцы name
и hobby
.
Однако, как вы видите, возникает проблема выравнивания, поскольку во втором узле отсутствует hobby
, а у Джона есть два увлечения.
в R я знаю, как извлекать определенные значения по одному, например, используя xml2
следующим образом:
myxml%>%
xml_find_all("//name") %>%
xml_text()
myxml%>%
xml_find_all("//hobby") %>%
xml_text()
но как я могу правильно выровнять эти данные в кадре данных? То есть, как я могу получить фрейм данных следующим образом (обратите внимание, как я соединяю с |
два увлечения Джона):
# A tibble: 2 × 3
name hobby skill
<chr> <chr> <chr>
1 John tennis|golf python
2 Robert <NA> R
В R я бы предпочел решение с использованием xml2
и dplyr
. В Python я хочу получить фрейм данных Pandas. Кроме того, в моем xml есть еще много переменных, которые я хочу проанализировать. Я хотел бы решение, которое позволяет пользователю анализировать дополнительные переменные, не слишком возясь с кодом.
Спасибо!
РЕДАКТИРОВАТЬ: спасибо всем за эти замечательные решения. Все они были действительно хороши, с большим количеством деталей, и было трудно выбрать лучший. Спасибо еще раз!
myxml %>% xml_find_all("/data/obs") %>% map(function(x) sapply(c("name","hobby"), function(y) xml_text(xml_find_first(x,y)))) %>% do.call(rbind, .)
? - person lukeA   schedule 28.05.2017sapply
? еще раз спасибо~ - person ℕʘʘḆḽḘ   schedule 28.05.2017reticulate
и RStudio. хм) - person lukeA   schedule 30.05.2017