#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_
(что является отсутствующим значением classcharacter
, которое печатается как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