Как преобразовать записанную последовательность в числовую последовательность?(Р) - PullRequest
0 голосов
/ 25 апреля 2018

У меня проблемы с набором данных, предоставленным бразильским правительством (поэтому он на португальском языке).Вот код, который его импортирует:

library(tidyverse)
locais_vot_SP <- read_delim("https://raw.githubusercontent.com/camilagonc/votacao_secao/master/locais_vot_SP.csv",
                        locale = locale(encoding = "ISO-8859-1"),
                        delim = ",",
                        col_names = F) %>% 
              filter(X4 == "VINHEDO")

names(locais_vot_SP) <- c("num_zona", 
                      "nome_local",
                      "endereco",
                      "nome_municipio",
                      "secoes",
                      "secoes_esp")

Как можно заметить, значения переменной secoes не организованы должным образом, так как разные данные агрегируются в одной и той же ячейке.

secoes
196ª; 207ª; 221ª; 231ª;
197ª; 211ª; 230ª; 249ª;

С помощью следующего кода я начал исправлять проблему:

locais_vot_SP <- locais_vot_SP %>% mutate(secoes = gsub("ª", "", secoes)) %>% 
                                   mutate(secoes_esp = gsub("ª", "", secoes_esp)) %>%
                                   mutate(secoes_esp = gsub(";", "", secoes_esp)) %>%
                                   mutate(secoes = gsub("Da ", "", secoes)) %>% 
                                   separate_rows(secoes, sep = ";") %>%  
                                   mutate(secoes = unlist(strsplit(locais_vot_SP$secoes, ";")))

И вот я дошел до этого:

secoes
32 à 38
100
121

Что еще нужно решить, так это случаив котором есть x à y (на английском языке x to y).Как я могу получить следующий вывод?

secoes
32
33
34
35
36
37
38
...

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Я пытался сохранить ваш основной рабочий процесс, но использовал gsubfn, чтобы применить функцию к регулярному выражению, которое использовалось для извлечения двух чисел, которые необходимо экстраполировать.

library(gsubfn)
locais_vot_SP <- locais_vot_SP %>% 
                                   mutate(secoes = unlist(strsplit(gsubfn("(\\d+)ª à (\\d+)", function(x,y) paste0(seq(x,y),collapse = "ª;"),secoes),","))) %>% 
                                   mutate(secoes = gsub("ª", "", secoes)) %>% 
                                   mutate(secoes_esp = gsub("ª", "", secoes_esp)) %>%
                                   mutate(secoes_esp = gsub(";", "", secoes_esp)) %>%
                                   mutate(secoes = gsub("Da ", "", secoes)) %>% 
                                   mutate(secoes = gsub(" ", "", secoes)) %>% 
                                   mutate(secoes = gsub(";$", "", secoes)) %>% 
                                   separate_rows(secoes, sep = ";")
0 голосов
/ 25 апреля 2018

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

map(
    locais_vot_SP$secoes,
    ~seq(
      as.numeric(str_extract(., "^(\\d+)")),
      as.numeric(str_extract(., "(\\d+)$")))) %>% 
  reduce(c)

или продолжить конвейер, выполнив %>% pull(secoes) %>% map(...) %>% reduce(c) %>% data.frame(secoes = .) Если вам это нужно в кадре данных с 1 столбцом.

Если естьдругие столбцы, о которых вы беспокоитесь, вы можете продолжить конвейер с

%>%
  mutate(secoes = map(...)) %>%
  unnest(secoes)

, чтобы сгладить на secoes

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