Почему функции регулярных выражений, такие как gsub() в R, не идентифицируют NA?

#r #na

#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 ?

Комментарии:

1. Это ошибочно. У вас есть числовой вектор с пропущенными значениями. Регулярное выражение работает с символьными векторами. Регулярное выражение не работает с пропущенными значениями.

2. Даже если мой вектор содержит символы, он не будет работать.

3. Смотрите Последнее предложение @DirkEddelbuettel в его ответе о том, почему регулярное выражение не будет работать.

4. Вы можете использовать регулярное выражение для определения буквы "N" , за которой следует буква "A" в тексте, например, "NA" . Но эти буквы не являются пропущенным значением. "NA" отличается от NA_character_ (что является отсутствующим значением class character , которое печатается как NA ). Смотрите, например, is.na(c("NA", "NA_character_", NA, NA_character_))

5. @Gregor Конечно. Но я чувствую, что вопрос не был ошибочным. Моим намерением было понять, почему это не работает.

Ответ №1:

Не используйте 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 значения, с условием an NA .

Ответ №2:

Как указывали другие, не используйте gsub. Вы можете использовать replace_na функцию из пакета tidyr.

 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