为什么R中的gx()之类的正则表达式函数无法识别NA?

时间:2019-04-10 20:17:14

标签: r na

我正在尝试使用NA之类的regex函数替换gsub-

样本数据-

a<-c(NA,1:5,NA,NA,1:3, rep(NA,round(runif(1,0,100))))

如何在NA匹配字段中识别pattern

例如-gsub("identify NA", 0, a)

注意-我知道其他替换NA的方法,但是我正在尝试使用NA来标识regex

编辑-我的目的是了解为什么正则表达式不能识别NA

2 个答案:

答案 0 :(得分:8)

请勿使用gsub()或其他reg.exp函数-NA 已经可以识别,因此请使用is.na()

示例

R> a<-c(NA,1:5,NA,NA,1:3, rep(NA,round(runif(1,0,100))))
R> a
 [1] NA  1  2  3  4  5 NA NA  1  2  3 NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
[30] NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA NA
R> a[is.na(a)] <- 42
R> a
 [1] 42  1  2  3  4  5 42 42  1  2  3 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
[30] 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42 42
R> 

在这里,我们仅用a来索引向量is.na(a),并且为了简单起见,只需为这些值分配一个新值。

简而言之,请勿在打印实际NA值和NA的条件时混淆显示的“文本” NA

答案 1 :(得分:3)

正如其他人指出的那样,请勿使用gsub。您可以使用tidyr软件包中的replace_na函数。

library(tidyr)
a<-c(NA,1:5,NA,NA,1:3, rep(NA,round(runif(1,0,100))))
replace_na(a, 0)
# [1] 0 1 2 3 4 5 0 0 1 2 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 #0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 # 0 0 0 0 0 0
# [84] 0 0 0 0 0 0 0