r - gsub 的否定 |替换某个向量中除字符串之外的所有内容

标签 r regex gsub negation

我有一个字符串向量:

ve <- c("N","A","A","A","N","ANN","NA","NFNFNAA","23","N","A","NN", "parnot", "important", "notall")

我想在这个向量中只保留三个可能的值:N , A , 和 NA .

因此,我想替换不是 N 的任何元素或 ANA .

我怎样才能做到这一点?

我尝试了以下方法:
gsub(ve, pattern = '[^NA]+', replacement = 'NA')
gsub(ve, pattern = '[^N|^A]+', replacement = 'NA')

但是这些效果不佳,因为它们将每个字符串中的“A”或“N”的每个实例都替换为 NA。所以在某些情况下,我最终会得到 NANANANANANA , 而不是简单的 NA .

最佳答案

使用否定前瞻断言。

ve <- c("N","A","A","A","N","ANN","NA","NFNFNAA","23","N","A","NN", "parnot", "important", "notall")
sub("^(?![NA]$).*", "NA", ve, perl=T)
# [1] "N"  "A"  "A"  "A"  "N"  "NA" "NA" "NA" "NA" "N"  "A"  "NA" "NA" "NA" "NA"
^(?![NA]$)断言

-> 开始后 ^应该只有一个字母 [NA]要么 NA后面应该是行尾 $ .
.*匹配所有字符

这样上面的正则表达式将匹配任何字符串,除了字符串是 NA

关于r - gsub 的否定 |替换某个向量中除字符串之外的所有内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49252888/

相关文章:

r - 如何合并不同大小的数据框并添加空白数据?

php - 函数 preg_quote 工作不正确?

创建 scanf 以格式化文本文件

javascript - 量词不起作用

awk - 如何删除前导和尾随空格?

r - 最佳地对一维数据进行聚类?

r - 如何使用 ggplot 突出显示更改线型或大小的线的特定区域

r - 如何在 dplyr::across() 中使用返回多个值的函数?

删除时间戳末尾

ruby - 正则表达式 *仅* 当它们包含在开始/结束括号之间时替换子字符串出现