【问题标题】:How do I remove part of a string that follows a certain pattern up to, but not including another pattern using R?如何删除遵循某种模式的字符串的一部分,但不包括使用 R 的另一个模式?
【发布时间】:2021-02-26 02:45:02
【问题描述】:

我在 R 中有一个包含人员数据的数据框。字符串的第一部分是全名。每隔一段时间,我就会遇到括号中的昵称。括号中可能还有我不想删除的其他数据。这是我正在使用的一种数据的示例:

Name <- c(
    "JOSEPH RYAN SMITH (USRID1)",
    "ANDREA J LOPEZ RAMIREZ (USRID2) (CONTRACTOR)",
    "TIMOTHY (TIM) JOHNSON (USRID3) (INTERN)",
    "JESSICA JENNIFER JONES (USRID4) (CONTRACTOR)",
    "WILLIAM (BILLIE) JOEL (USRID5)")
df <- as.data.frame(Name)

我明白了:

                                         Name
1                   JOSEPH RYAN SMITH (USRID1)
2 ANDREA J LOPEZ RAMIREZ (USRID2) (CONTRACTOR)
3      TIMOTHY (TIM) JOHNSON (USRID3) (INTERN)
4 JESSICA JENNIFER JONES (USRID4) (CONTRACTOR)
5               WILLIAM (BILLIE) JOEL (USRID5)

我只想删除昵称。我注意到一个昵称的不同之处在于它总是在括号中,并且总是跟在一个姓氏之后。括号中包含的所有其他指示符后跟“(”或记录结尾。我尝试删除括号中的字符串,该字符串后跟空格和字符 A-Z。

df$Name <- str_remove(df$Name, "[\\(][A-Z]+[\\)][ ][A-Z]")

这删除了姓氏的第一个字母并给了我:

 Name
1                   JOSEPH RYAN SMITH (USRID1)
2 ANDREA J LOPEZ RAMIREZ (USRID2) (CONTRACTOR)
3             TIMOTHY OHNSON (USRID3) (INTERN)
4 JESSICA JENNIFER JONES (USRID4) (CONTRACTOR)
5                         WILLIAM OEL (USRID5)

我也没有成功尝试过“不跟(”这样的:

df$Name <- str_remove(df$Name, "[\\(][A-Z]+[\\)][ ][^\\(]")

我尝试了其他一些方法,删除了我需要保留的括号中的其他指标。任何帮助表示赞赏。谢谢。

【问题讨论】:

    标签: r regex dataframe stringr


    【解决方案1】:

    使用正向lookeahd (?=),以便匹配姓氏的第一个字母,但不会被删除。

    stringr::str_remove(df$Name, "\\([A-Z]+\\)\\s(?=[A-Z])")
    
    #[1] "JOSEPH RYAN SMITH (USRID1)"                  
    #[2] "ANDREA J LOPEZ RAMIREZ (USRID2) (CONTRACTOR)"
    #[3] "TIMOTHY JOHNSON (USRID3) (INTERN)"           
    #[4] "JESSICA JENNIFER JONES (USRID4) (CONTRACTOR)"
    #[5] "WILLIAM JOEL (USRID5)" 
    

    您也可以使用sub 在基础 R 中编写此代码:

    sub('\\([A-Z]+\\)\\s(?=[A-Z])', '', df$Name, perl = TRUE)
    

    【讨论】:

    • 会的!跑了 1M 行,看起来不错!
    猜你喜欢
    • 2021-07-05
    • 2019-03-03
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-14
    相关资源
    最近更新 更多