Измените все строки между двумя наборами строк

#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