Проблема форматирования электронных таблиц в R, как я могу читать и писать в таблицы, используя R? - PullRequest
1 голос
/ 11 марта 2020

Я впервые работаю с R на уроке в колледже. Предисловие: я не знаю достаточно, чтобы знать, чего я не знаю, поэтому извините, если этот вопрос задавался ранее. Я пытаюсь предсказать результаты выборов в Палату представителей штата Техас в 2020 году, и я думаю, что лучшим приоритетом для этого являются результаты выборов в палаты представителей штата в 2018 году. Существует 150 гонок, поэтому я не могу ввести их все вручную, но я не могу найти таблицу, в которой данные отформатированы так, как я хочу. Я хочу это в довольно стандартном формате таблицы: Мой желаемый формат таблицы . Тем не менее, таблица от госсекретаря, которая у меня есть, выглядит следующим образом: Грубая безобразная таблица.

Я написал некоторый код psuedo: Вот код Psuedo, в основном мы хотим создать новый CSV:

'' '% Сначала мы хотим найти район, гонкам домов всегда предшествует линия тире, поэтому мне понадобится такая функция:

Create a New CSV;
for(x=1; x<151 ; x +=1){
    Assign x to the cell under the district number cloumn;
    Find "---------------" ;
    Go down one line;
    Go over two lines;

% We should now be in the third column and now want to read in which party got how many votes. The number of parties is not consistant, so we need to account for uncontested races, libertarians, greens, and write ins. I want totals for Republicans, Democrats, and Other.

while(cell is not empty){
    Party <- function which reads cell (but I want to read a string);
    go right one column;
    Votes <- function which reads cell (but I want to read an integer);
    if(Party = Rep){
        put this data in place in new CSV;
    else if (Party = Dem)
        put this data in place in new CSV;
    else
        OtherVote += Votes;
    };
};
Assign OtherVote to the column for other party;
OtherVote <- 0;

%Now I want to assign 0 to null cells (ones where no rep, or no Dem, or no other party contested

read through single row 4 spaces, if its null assign it 0;
Party <- null
};'''

Но я не знаю достаточно, чтобы Google, что делать! Вот что мне нужно для помощи: могу ли я создать новый CSV в Rstudio, как? Как я могу прочитать определенные c ячейки в таблице, надеюсь, индексирование? Наконец, как мне написать в таблицу на R. Любая помощь приветствуется! Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 марта 2020

В Википедии, кажется, есть таблица, которая ближе к формату, который вы ищете. Чтобы добраться до нужной таблицы, нам нужно выполнить несколько шагов:

  1. Загрузить данные из Википедии и извлечь таблицу.
  2. Очистить таблицу.
  3. Выберите столбцы.
  4. Рассчитайте поля.

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)

После этого вы можете рассчитать маржу аналогично тому, как я делал с данными из Википедии.

0 голосов
/ 11 марта 2020

Как я могу создать новый CSV в Rstudio, как?

Да, вы можете. Используйте функцию «write.csv».

write.csv(df, file = "df.csv") # см. Справку для получения дополнительной информации.

Как можно прочитать определенные c ячейки в таблице?

Используйте скобки после df, пример ниже.

df <- data.frame(x = c(1,2,3),  y = c("A","B","C"), z = c(15,25,35))

df[1,1]

#[1] 1

df[1,1:2]

#  x y
#1 1 A

Как записать таблицу в R?

Если Вы хотите написать таблицу в xlsx, используя функцию write.xlsx из пакета openxlsx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...