Я пытаюсь извлечь некоторые XML-данные из шведской статистики выборов и создать из них фрейм данных в R, но я не настолько знаком с XML-файлами и не могу получить нужную мне информацию.Я видел еще несколько вопросов о том, как создать фрейм данных из многих файлов XML, но они имеют более простую структуру, чем те, с которыми я работаю.
Данные публикуются в виде сжатой папки со многимиXML-файлы.Его можно прочитать с помощью следующего кода R:
library(xml2)
library(tidyverse)
tf <- tempfile(tmpdir = tdir <- tempdir())
download.file("https://data.val.se/val/val2014/valnatt/valnatt.zip", tf)
xml_files <- unzip(tf, exdir = tdir)
Папка содержит файлы для каждого из 290 муниципалитетов (файлы с 4-значными кодами) и каждого типа выборов, где последняя буква в имени файла указывает натип выборов (R = национальный парламент, L = окружной совет, K = муниципальный совет).Он также содержит 3 файла XML для общих результатов для каждого из трех типов выборов.Файлы XML с муниципальными данными имеют следующую структуру (для ясности удалены строки):
<?xml version="1.0" encoding="ISO-8859-1"?>
<?xml-stylesheet type="text/html"?>
<!DOCTYPE VAL PUBLIC "-//Valmyndigheten//DTD Valresultat parti kommun 1.5//SV" "http://www.val.se/dtd/resultat/parti_kommun_1_5.dtd">
<VAL TILLFÄLLE="Allmänna val 14 september 2014" FILNAMN="valnatt_0114R.xml" RAPPORTERING="VALNATTSRAPPORTERING" VALTYP="Riksdagsval" VALDAG="20140914" VALDAG_FGVAL="20100919" TID_RAPPORT="20140916105203">
<PARTI FÖRKORTNING="M" BETECKNING="Moderaterna" FÄRG="#66BEE6" />
<KOMMUN KOD="0114" NAMN="Upplands Väsby" TYP="Summering" KLARA_VALDISTRIKT="22" ALLA_VALDISTRIKT="22" RÖSTER="23638" RÖSTER_FGVAL="22215" TID_RAPPORT="20140914230336" MODNR="117144935">
<GILTIGA PARTI="M" RÖSTER="6748" RÖSTER_FGVAL="8201" PROCENT="28,5" PROCENT_FGVAL="36,9" PROCENT_ÄNDRING="-8,4"/>
<GILTIGA PARTI="C" RÖSTER="901" RÖSTER_FGVAL="891" PROCENT="3,8" PROCENT_FGVAL="4,0" PROCENT_ÄNDRING="-0,2"/>
<KRETS_KOMMUN KOD="011401" NAMN="Norra valkretsen" TYP="Summering" KLARA_VALDISTRIKT="12" ALLA_VALDISTRIKT="12" RÖSTER="11907" RÖSTER_FGVAL="11202" TID_RAPPORT="20140914222651" MODNR="117118974">
<GILTIGA PARTI="M" RÖSTER="3083" RÖSTER_FGVAL="3860" PROCENT="25,9" PROCENT_FGVAL="34,5" PROCENT_ÄNDRING="-8,6"/>
<GILTIGA PARTI="C" RÖSTER="440" RÖSTER_FGVAL="431" PROCENT="3,7" PROCENT_FGVAL="3,8" PROCENT_ÄNDRING="-0,2"/>
<VALDISTRIKT KOD="01140212" NAMN="Smedby Södra" RÖSTER="1201" RÖSTER_FGVAL="1186" TID_RAPPORT="20140914230336" MODNR="117144935">
<GILTIGA PARTI="M" RÖSTER="227" RÖSTER_FGVAL="336" PROCENT="18,9" PROCENT_FGVAL="28,3" PROCENT_ÄNDRING="-9,4"/>
<GILTIGA PARTI="C" RÖSTER="35" RÖSTER_FGVAL="17" PROCENT="2,9" PROCENT_FGVAL="1,4" PROCENT_ÄNDRING="+1,5"/>
<GILTIGA PARTI="FP" RÖSTER="43" RÖSTER_FGVAL="61" PROCENT="3,6" PROCENT_FGVAL="5,1" PROCENT_ÄNDRING="-1,6"/>
<ÖVRIGA_GILTIGA RÖSTER="20" RÖSTER_FGVAL="10" PROCENT="1,7" PROCENT_FGVAL="0,8" PROCENT_ÄNDRING="+0,8"/>
<OGILTIGA TEXT="BLANK" RÖSTER="12" RÖSTER_FGVAL="13" PROCENT="1,0" PROCENT_FGVAL="1,1" PROCENT_ÄNDRING="-0,1"/>
<OGILTIGA TEXT="OG" RÖSTER="13" RÖSTER_FGVAL="1" PROCENT="1,1" PROCENT_FGVAL="0,1" PROCENT_ÄNDRING="+1,0"/>
<VALDELTAGANDE RÖSTBERÄTTIGADE="1551" RÖSTBERÄTTIGADE_KLARA_VALDISTRIKT_FGVAL="1546" SUMMA_RÖSTER="1226" SUMMA_RÖSTER_FGVAL="1200" PROCENT="79,0" PROCENT_FGVAL="77,6" PROCENT_ÄNDRING="+1,4"/>
</VALDISTRIKT>
</KRETS_KOMMUN>
</KOMMUN>
</VAL>
Теперь я хотел бы, чтобы каждый файл получал данные во всех узлах VALDISTRIKT
и ниже и создавалфрейм данных.Я не уверен, как лучше структурировать такой фрейм данных, но следующей структуры будет достаточно, где GROUP
содержит PARTI в GILTIGA, TEXT в OGILTIGA и просто ÖVRIGA_GILTIGA в ÖVRIGA_GILTIGA.Если возможно, я также хотел бы добавить PROCENT и PROCENT_FG_VAL из VALDELTAGANDE в качестве переменных (с одинаковой информацией для каждой строки в одном VALDISTRIKT).
KOD NAMN GROUP RÖSTER RÖSTER_FG_VAL PROCENT PROCENT_FG_VAL PROCENT_FÖRÄNDRING
01140212 "Smedby Södra" M 227 336 18,9 18,3 -9,4
01140212 "Smedby Södra" C 35 17 2,9 1,4 +1,5
01140212 "Smedby Södra" FP 43 61 3,6 5,1 -1,6
01140212 "Smedby Södra" ÖVRIGA_GILTIGA 20 10 1,7 0,8 +0,8
01140212 "Smedby Södra" BLANK 12 13 1,0 1,1 -0,1
01140212 "Smedby Södra" OG 13 1 1,1 0,1 +1,0
Эта информация должна быть получена из каждого VALDISTRIKT в каждом из 290 файлов с именем из 4 цифр и оканчивающимся буквой R. Думаю, мне следует зациклить эти файлы или, скорее, использовать map_df
?
Я понимаю, что это много, чтобы задать вопрос, и мне жаль, если я не использую правильные термины для частей файла XML, но если бы вы могли дать мне несколько советово том, как получить информацию из XML-файлов во фрейм данных или где я мог бы прочитать больше о том, как это сделать, было бы очень полезно.
ОБНОВЛЕНИЕ
Мне удалось сделать несколько шагов вперед.Для одного файла я могу получить всю информацию в двух отдельных фреймах данных, используя следующий код, где верхняя часть содержит данные о округе, а нижняя часть содержит результаты выборов.Теперь мне нужно найти способ объединить их и настроить код для чтения всех файлов.
top <- xml_find_all(t, "//VALDISTRIKT")
top <- top %>%
map(xml_attrs) %>%
map_df(~as.list(.))
below <- xml_find_all(t, "//VALDISTRIKT/*")
below <- p2 %>%
map(xml_attrs) %>%
map_df(~as.list(.))
Всего наилучшего, R