为什么像 R 中的 gsub() 这样的正则表达式函数不能识别 NA?
Why regex functions like gsub() in R doesn't identify NA?
我正在尝试使用 regex
函数替换 NA
,例如 gsub
-
示例数据-
a<-c(NA,1:5,NA,NA,1:3, rep(NA,round(runif(1,0,100))))
如何在 pattern
匹配字段中识别 NA
。
例如- gsub("identify NA", 0, a)
注意 - 我知道其他方法可以替换 NA
,但我正在尝试使用 regex
来识别 NA
。
编辑-我的目的是了解,为什么正则表达式不能识别 NA
?
不要使用 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>
这里我们简单地通过 is.na(a)
索引向量 a
并且为了简单起见,只需为这些值分配一个新值。
简而言之,不要将打印实际 NA
值时显示的 "text" NA
与 NA
.
的条件混淆
正如其他人所指出的,不要使用 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
我正在尝试使用 regex
函数替换 NA
,例如 gsub
-
示例数据-
a<-c(NA,1:5,NA,NA,1:3, rep(NA,round(runif(1,0,100))))
如何在 pattern
匹配字段中识别 NA
。
例如- gsub("identify NA", 0, a)
注意 - 我知道其他方法可以替换 NA
,但我正在尝试使用 regex
来识别 NA
。
编辑-我的目的是了解,为什么正则表达式不能识别 NA
?
不要使用 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>
这里我们简单地通过 is.na(a)
索引向量 a
并且为了简单起见,只需为这些值分配一个新值。
简而言之,不要将打印实际 NA
值时显示的 "text" NA
与 NA
.
正如其他人所指出的,不要使用 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