Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用gsub替换某些字符串以外的字符_R_Regex_Gsub - Fatal编程技术网

R 用gsub替换某些字符串以外的字符

R 用gsub替换某些字符串以外的字符,r,regex,gsub,R,Regex,Gsub,我试图替换列中与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&

我试图替换列中与
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 

最好的方法是什么?

实际上,不需要正则表达式,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))
库(dplyr)
例外情况%
变异(新=如果其他(!(partij_kort%在%例外中),
“某物”,
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      
#一个tible:5 x 2
科特新党
1 GB左右
2 VVD VVD
3德国劳埃德船级社
尼乌维尔什么的
5 CDA CDA

您需要在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
库(tidyverse)
df%突变(新的=gsub(^((?!(VVD | GL | CDA | CU | D66 | PVDA | CUSGP | PVDAGL))*”,
“某物”,partij_kort,perl=TRUE)
#一个tibble:9x2
科特新党
1 GB左右
2 VVD VVD
3德国劳埃德船级社
尼乌维尔什么的
5 CDA CDA
有什么事吗
好东西
8件坏事
什么事

谢谢

您也可以使用
替换
grepl
如下:

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
库(tidyverse)
df%>%突变(新=替换(partij|u kort,!grepl(“VVD | GL | CDA | CU | D66 | PVDA | CUSGP | PVDAGL”,
partij_kort),“某物”))
#一个tibble:5x2
#科特新党
#             
#1 GB左右
#2 VVD VVD
#3德国劳埃德船级社
#尼乌维尔什么的
#5 CDA CDA

尝试
“^(?(?:VVD | GL | CDA | CU | D66 | PVDA | CUSGP | SGP | PVDAGL)$)。”
并将
perl=TRUE
添加到
gsub
调用中作为最后一个参数。如果您需要替换列表中除替代词以外的任何值,则该选项将起作用。我只是怀疑这是最好的方法。或者将
、invert=TRUE
grep
结合使用grepl
?你能在回答中详细说明一下吗?
partij_kort
能包含
SGP ABC
值吗?如果是,在
new
列中的预期结果是什么?我只是在问题中添加了我想要的结果。问题是我想在这些字符串上选择:
“VVD | GL | CDA | CU | D66 | PVDA | CUSGP | SGP | PVDAGL”
(这些是例外)然后是我不想在
中更改的每个字符串。我的示例是
partij_kort
中多个字符串的一个小示例。如果我还有其他(!partij_kort%in%exceptions,“something”,partij_kort))
我能做什么吗?
啊,谢谢!如果您更改了更适合问题的答案(因此使用不同的字符串和
标记),我可以接受您的答案@特德布斯:我做到了。
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
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