gsub | 的否定替换特定向量中除字符串以外的所有内容

Negation of gsub | Replace everything except strings in a certain vector

我有一个字符串向量:

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

我只想在此向量中保留三个可能的值:NANA

因此,我想将任何不是 NA 的元素替换为 NA

我怎样才能做到这一点?

我尝试了以下方法:

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

如果我们正在寻找固定的匹配项,则使用 %in% 和否定 ! 并将其分配给 'NA'

ve[!ve %in% c("A", "N", "NA")] <- 'NA'

请注意,在 R 中,缺失值未加引号 NA 且未加引号。希望它是一个不同的类别,并建议将类别名称更改为不同的名称以避免将来在解析时造成混淆

这是一个替代的正则表达式解决方案

ve[!grepl("^[N|A]$", ve)] <- NA_character_

您仍然可能应该采用 Akrun 的解决方案。