#r #string #rows #between
#r #строка #строки #между
Вопрос:
В настоящее время я работаю с несколькими наборами данных, содержащими информацию о 5570 бразильских муниципалитетах, и мне часто приходится объединять их по имени. Но случается, что несколько имен повторяются в разных состояниях (которые названы в UF: rows). Примером набора данных является:
<chr>
1 UF: Alagoas
2 IBATEGUARA
3 MARAGOGI
4 MESSIAS
5 PENEDO
6 PORTO CALVO
7 UF: Amazonas
8 APUI
9 HUMAITA
10 MANAQUIRI
И то, что я хочу, было бы чем-то, чтобы отличать каждый муниципалитет от того, в каком штате он находится:
<chr>
1 UF: Alagoas
2 IBATEGUARA (AL)
3 MARAGOGI (AL)
4 MESSIAS (AL)
5 PENEDO (AL)
6 PORTO CALVO (AL)
7 UF: Amazonas
8 APUI (AM)
9 HUMAITA (AM)
10 MANAQUIRI (AM)
При этом у меня было бы уникальное имя для каждой местности. Я пытался использовать mutate_at
и вводить строки между каждым идентификатором состояния, но я хотел бы более простой способ сделать это в разных наборах данных. Как я могу изменить все строки между двумя наборами строк?
Комментарии:
1. Да, они были бы чем-то вроде AL для Alagoas и AM для Amazonas и так далее. Я хочу специально добавить эту аббревиатуру к названию каждого муниципалитета.
Ответ №1:
Одним из вариантов было бы создать столбец группировки на основе появления строки ‘UF’
library(dplyr)
library(stringr)
df1 %>%
group_by(grp = cumsum(str_detect(col1, '^UF:\s ')) %>%
mutate(newcol = toupper(str_extract(first(col1), '(?<=UF: )\w{2}')),
col1 = case_when(row_number() > 1
~ sprintf('%s (%s)', col1, newcol), TRUE ~ col1)) %>%
ungroup %>%
select(col1)
Ответ №2:
Я бы предложил создать новый код в новой метке. Этот подход использует tidyverse
функции и base R
:
#Data
df <- structure(list(V1 = c("UF: Alagoas", "IBATEGUARA", "MARAGOGI",
"MESSIAS", "PENEDO", "PORTO CALVO", "UF: Amazonas", "APUI", "HUMAITA",
"MANAQUIRI")), class = "data.frame", row.names = c(NA, -10L))
Код:
Мы обнаруживаем шаблоны UF
:
#Detect UF
i1 <- df$V1[which(grepl('UF:',df$V1))]
i2 <- which(grepl('UF:',df$V1))
Теперь мы создаем и форматируем метки:
#Format labels
labs <- gsub('UF: ','',i1,fixed = T)
labs <- toupper(substr(labs,1,2))
Мы назначаем новую переменную для сохранения меток с индексацией:
#Create a new var and assign
df$Label <- NA
df$Label[i2] <- labs
Мы заполняем переменную:
#Now fill
df %>% fill(Label) -> df
Мы подготавливаем переменную для удаления UF
строк:
#Remove UF
df$Label[i2] <- NA
Наконец, мы фильтруем набор данных:
#Format dataset
df <- df[!is.na(df$Label),]
Вывод:
V1 Label
2 IBATEGUARA AL
3 MARAGOGI AL
4 MESSIAS AL
5 PENEDO AL
6 PORTO CALVO AL
8 APUI AM
9 HUMAITA AM
10 MANAQUIRI AM