【问题标题】:Replace string if it matches part of another string如果字符串匹配另一个字符串的一部分,则替换字符串
【发布时间】:2021-07-11 22:43:52
【问题描述】:

我有一列人的姓氏和他们的首字母,在某些情况下,一个人可能会被列出两次,一次是一个首字母(例如 SMITH C),一次是两个首字母(例如 SMITH CD),我想替换SMITH C 的所有 SMITH CD 实例。

一个例子

df <- data.frame(
  id = 1:7,
  names = c("JOHN S", "JOHN SW", "JOHNSON S",
            "SMITH C", "SMITH WC", "SMITH CD",
            "HANK K"))
> df
  id     names
1  1    JOHN S
2  2   JOHN SW
3  3 JOHNSON S
4  4   SMITH C
5  5  SMITH WC
6  6  SMITH CD
7  7    HANK K

我可以为单个名称手动执行此操作,例如:

df$names <- gsub("SMITH CD", "SMITH C", df$names)

> df
  id     names
1  1    JOHN S
2  2   JOHN SW
3  3 JOHNSON S
4  4   SMITH C
5  5  SMITH WC
6  6   SMITH C
7  7    HANK K

但我的真实数据集包含约 4000 个名称,因此我希望能够:

  1. 以编程方式识别姓氏和第一个首字母匹配的情况,并且
  2. 一次性完成所有替换

对于上面的小例子 df,结果将是:

> df
  id     names
1  1    JOHN S
2  2    JOHN S
3  3 JOHNSON S
4  4   SMITH C
5  5  SMITH WC
6  6   SMITH C
7  7    HANK K

任何帮助将不胜感激。

【问题讨论】:

    标签: r regex string text replace


    【解决方案1】:

    当有两个字母单词时,通过删除末尾的字母创建分组列,然后通过选择具有最少字符数的元素来修改names

    library(dplyr)
    library(stringr)
    df %>% 
        group_by(grp = str_remove(names, "(?<= [A-Z])[A-Z]$")) %>% 
        mutate(names = names[which.min(nchar(names))]) %>%
        ungroup %>%
        select(-grp)
    

    -输出

    # A tibble: 7 x 2
    #     id names    
    #  <int> <chr>    
    #1     1 JOHN S   
    #2     2 JOHN S   
    #3     3 JOHNSON S
    #4     4 SMITH C  
    #5     5 SMITH WC 
    #6     6 SMITH C  
    #7     7 HANK K   
    

    【讨论】:

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