【问题标题】:Replace characters except certain strings with gsub用 gsub 替换除某些字符串以外的字符
【发布时间】:2018-10-19 08:12:10
【问题描述】:

我正在尝试替换列中与gsub 函数中的模式匹配的字符。

数据列:

library(tidyverse)

df <- structure(list(partij_kort = c("COMBGB", "VVD", "GL", "NIEUWEL", 
"CDA")), .Names = "partij_kort", row.names = c(NA, -5L), class = c("tbl_df", 
"tbl", "data.frame"))

  partij_kort
  <chr>      
1 COMBGB     
2 VVD        
3 GL         
4 NIEUWEL    
5 CDA 

这段代码与我想要的相反:

df %>% mutate(new = gsub("VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL",
                         "something",
                         partij_kort))

  partij_kort new      
  <chr>       <chr>    
1 COMBGB      COMBGB   
2 VVD         something
3 GL          something
4 NIEUWEL     NIEUWEL  
5 CDA         something

我希望在该模式中的每个字符串(COMBGBNIEUWEL)都更改为 something

但是感叹号 ! 不适用于 gsub(我在 grepl 中经常使用它)。

期望的结果:

  partij_kort new      
  <chr>       <chr>    
1 COMBGB      something
2 VVD         VVD      
3 GL          GL       
4 NIEUWEL     something
5 CDA         CDA 

最好的方法是什么?

【问题讨论】:

  • 尝试"^(?!(?:VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL)$).*" 并将perl=TRUE 添加到gsub 调用中作为最后一个参数。如果您需要替换列表中替代词以外的任何值,它将起作用。我只是怀疑这是最好的方法。
  • 或将,invert = TRUEgrep!grepl结合
  • 在 gsub 函数中?您能否详细说明答案?
  • partij_kort 可以包含SGP ABC 值吗?如果是,new 列的预期结果是什么?
  • 我刚刚在问题中添加了我想要的结果。

标签: r regex gsub


【解决方案1】:

其实不需要正则表达式,imo:

library(dplyr)

exceptions <- c("VVD","GL","CDA","CU","D66","PVDA","CUSGP","SGP","PVDAGL")

df %>%
  mutate(new = if_else(!(partij_kort %in% exceptions), 
                       "something", 
                       partij_kort))

这会产生

# A tibble: 5 x 2
  partij_kort new      
  <chr>       <chr>    
1 COMBGB      something
2 VVD         VVD      
3 GL          GL       
4 NIEUWEL     something
5 CDA         CDA      

【讨论】:

  • 问题是我想在这些字符串上进行选择:"VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL"(这些是例外)然后是我不想在something 中更改的每个字符串。我的例子是partij_kort 中多个字符串的一个小例子。我可以做if_else(!partij_kort %in% excepetions, "something", partij_kort))
  • 啊,谢谢!如果您更改更适合问题的答案(因此使用不同的字符串和! 标记)我可以接受您的答案!
  • @Tdebeus:完成了。
【解决方案2】:

您需要在 gsub 中使用 perl=TRUE 和一个正则表达式来否定您的选择。

library(tidyverse)

df <- structure(list(partij_kort = c("COMBGB", "VVD", "GL", "NIEUWEL", "CDA", "anything", "good" ,"bad","whtever")), 
                .Names = "partij_kort", 
                row.names = c(NA, -9L), 
                class = c("tbl_df", "tbl", "data.frame"))

df %>% mutate(new = gsub("^((?!(VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL)).)*$",
                         "something", partij_kort, perl = TRUE))


# A tibble: 9 x 2
  partij_kort new      
  <chr>       <chr>    
1 COMBGB      something
2 VVD         VVD      
3 GL          GL       
4 NIEUWEL     something
5 CDA         CDA      
6 anything    something
7 good        something
8 bad         something
9 whtever     something

谢谢

【讨论】:

    【解决方案3】:

    您也可以将replacegrepl 一起使用,如下所示:

    library(tidyverse)
    df %>% mutate(new = replace(partij_kort , !grepl("VVD|GL|CDA|CU|D66|PVDA|CUSGP|SGP|PVDAGL",
                             partij_kort),"something"))
    
    
    # A tibble: 5 x 2
    #  partij_kort       new
    #        <chr>     <chr>
    #1      COMBGB something
    #2         VVD       VVD
    #3          GL        GL
    #4     NIEUWEL something
    #5         CDA       CDA
    

    【讨论】:

      猜你喜欢
      • 2020-06-09
      • 2013-07-09
      • 2013-09-05
      • 2018-08-23
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 2021-07-16
      • 1970-01-01
      相关资源
      最近更新 更多