如何将书面序列转换为数字序列? (R)

时间:2018-04-25 20:00:37

标签: r tidyverse

我遇到了巴西政府提供的数据集(因此,它是葡萄牙语)。这是导入它的代码:

 1. React.Component<any, any>
 2. React.Component<{}, {}>

可以注意到,变量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

2 个答案:

答案 0 :(得分:1)

我尝试保留您的基本工作流程,但使用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 = ";")

答案 1 :(得分:0)

通过创建范围,您将更改列的长度。 Sicne你似乎只关心那个列,这是最简单的吗

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