【问题标题】:Modify all the strings between two sets of rows修改两组行之间的所有字符串
【发布时间】:2020-08-26 22:08:43
【问题描述】:

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

【问题讨论】:

  • 是的,它们将类似于 Alagoas 的 AL 和 Amazonas 的 AM 等等。我想要的是专门将此缩写添加到每个市政当局的名称中。

标签: r string rows between


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      相关资源
      最近更新 更多