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

时间:2018-03-13 09:46:30

标签: r regex gsub negation

我有一个字符串向量:

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

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

因此,我想用N替换任何非ANA的元素。

我怎样才能做到这一点?

我尝试了以下内容:

gsub(ve, pattern = '[^NA]+', replacement = 'NA')
gsub(ve, pattern = '[^N|^A]+', replacement = 'NA')

但是这些效果不好,因为它们用NA替换每个字符串中的“A”或“N”的每个实例。因此,在某些情况下,我最终会使用NANANANANANA,而不仅仅是NA

3 个答案:

答案 0 :(得分:4)

使用否定先行断言。

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]$)断言

- &GT;在开始^之后,应该只有一个字母[NA] NA,后面应该是行结束$

.*匹配所有字符

因此,除了字符串NA

之外,上面的正则表达式将匹配任何字符串

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:1)

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

稍微简单且快得多
ve[!grepl("^[N|A]$", ve)] <- NA_character_

你仍然应该选择Akrun的解决方案,这个解决方案“既简单又直接”,而且速度更快。