修改两组行之间的所有字符串

Modify all the strings between two sets of rows

我目前正在处理几个包含 5570 个巴西城市信息的数据集,我经常需要按名称合并它们。但碰巧有几个名称在各州之间重复(在 UF: 行中命名)。一个数据集的例子是:

   <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 并在每个状态标识符之间输入行,但我想要一种更简单的方法来跨不同的数据集执行此操作。如何修改两组行之间的所有字符串?

一个选项是根据 '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)        
   

我建议在新标签中创建新代码。此方法使用 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