我遇到了巴西政府提供的数据集(因此,它是葡萄牙语)。这是导入它的代码:
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
答案 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