我有一个字符串向量:
ve <- c("N","A","A","A","N","ANN","NA","NFNFNAA","23","N","A","NN", "parnot", "important", "notall")
我想在此向量中仅保留三个可能的值:N
,A
和NA
。
因此,我想用N
替换任何非A
或NA
的元素。
我怎样才能做到这一点?
我尝试了以下内容:
gsub(ve, pattern = '[^NA]+', replacement = 'NA')
gsub(ve, pattern = '[^N|^A]+', replacement = 'NA')
但是这些效果不好,因为它们用NA替换每个字符串中的“A”或“N”的每个实例。因此,在某些情况下,我最终会使用NANANANANANA
,而不仅仅是NA
。
答案 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]
N
或A
,后面应该是行结束$
。
.*
匹配所有字符
因此,除了字符串N
或A
答案 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的解决方案,这个解决方案“既简单又直接”,而且速度更快。