В Википедии, кажется, есть таблица, которая ближе к формату, который вы ищете. Чтобы добраться до нужной таблицы, нам нужно выполнить несколько шагов:
- Загрузить данные из Википедии и извлечь таблицу.
- Очистить таблицу.
- Выберите столбцы.
- Рассчитайте поля.
1. Загрузите данные из Википедии и извлеките таблицу.
Таблица rvest
помогает загружать и анализировать веб-сайты в R-объектах. Сначала мы загружаем HTML всего сайта.
library(dplyr)
library(rvest)
wiki_html <-
read_html(
"https://en.wikipedia.org/wiki/2018_United_States_House_of_Representatives_elections_in_Texas"
)
Есть несколько способов получить специфицированный c объект из файла HTML, в этом случае я решил поискать таблицу у которого есть имя класса «сортируемые викибельные заголовки», как я узнал из проверки кода, что единственная таблица с этим классом - это та, которую мы хотим извлечь.
library(purrr)
html_nodes(wiki_html, "table") %>%
map_lgl( ~ html_attr(., "class") == "wikitable plainrowheaders sortable") %>%
which()
#> [1] 20
Затем мы можем выбрать таблицу № 20 и преобразовать его в кадр данных с html_table()
raw_table <-
html_nodes(wiki_html, "table")[[20]] %>%
html_table(fill = TRUE)
2. Очистить таблицу.
Таблица имеет дублированные имена, мы можем изменить это, используя as_tibble()
и аргумент .name_repair
. Затем мы используем dplyr::select()
, чтобы получить столбцы. Кроме того, мы используем dplyr::filter()
, чтобы удалить первые две строки, которые имеют "District" в качестве значения в столбце District
. Теперь столбцы по-прежнему characters
векторов, но нам нужно, чтобы они были numeric
, поэтому сначала мы удаляем запятые из всех столбцов, а затем преобразуем столбцы со 2 по 4 в цифру c.
clean_table <-
raw_table %>%
as_tibble(.name_repair = "unique") %>%
filter(District != "District") %>%
mutate_all( ~ gsub(",", "", .)) %>%
mutate_at(2:4, as.numeric)
3. Выберите столбцы и 4. Рассчитайте поля.
Мы используем dplyr::select()
, чтобы выбрать интересующие вас столбцы и дать им более полезные названия. Наконец, мы рассчитываем разницу между демократиями c и республиканскими голосами, сначала сложив в них голоса как total_votes
, а затем разделив разницу на total_votes
.
clean_table %>%
select(District,
RepVote = Republican...2,
DemVote = Democratic...4,
OthVote = Others...6) %>%
mutate(
total_votes = RepVote + DemVote,
margin = abs(RepVote - DemVote) / total_votes * 100
)
#> # A tibble: 37 x 6
#> District RepVote DemVote OthVote total_votes margin
#> <chr> <dbl> <dbl> <chr> <dbl> <dbl>
#> 1 District 1 168165 61263 3292 229428 46.6
#> 2 District 2 139188 119992 4212 259180 7.41
#> 3 District 3 169520 138234 4604 307754 10.2
#> 4 District 4 188667 57400 3178 246067 53.3
#> 5 District 5 130617 78666 224 209283 24.8
#> 6 District 6 135961 116350 3731 252311 7.77
#> 7 District 7 115642 127959 0 243601 5.06
#> 8 District 8 200619 67930 4621 268549 49.4
#> 9 District 9 0 136256 16745 136256 100
#> 10 District 10 157166 144034 6627 301200 4.36
#> # … with 27 more rows
Редактировать: Если вы хотите go с данными, предоставленными государством, мне кажется, что данные, которые вы ищете, находятся в первом, третьем и четвертом столбце. Итак, что вы хотите сделать:
(Весь приведенный ниже код не проверен, поскольку у меня нет исходных данных.)
считывание данных в R
library(readr)
tx18 <- read_csv("filename.csv")
выбрать соответствующие столбцы
tx18 <- tx18 %>%
select(c(1,3,4))
очистить таблицу
tx18 <- tx18 %>%
filter(!is.na(X3),
X3 != "Party",
X3 != "Race Total")
Группировать и суммировать данные по партиям
tx18 <- tx18 %>%
group_by(X3) %>%
summarise(votes = sum(X3))
Сводить / преобразовывать данные в широкоформатный формат
tx18 %>$
pivot_wider(names_from = X3,
values_from = votes)
После этого вы можете рассчитать маржу аналогично тому, как я делал с данными из Википедии.