R не может конвертировать NaN в NA - PullRequest
7 голосов
/ 28 февраля 2012

У меня есть фрейм данных с несколькими факторными столбцами, содержащими NaN, которые я хотел бы преобразовать в NA (NaN, похоже, является проблемой для использования объектов линейной регрессии для прогнозирования новых данных).

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN)
> tester1 
[1] "2"   "2"   "3"   "4"   "2"   "3"   "NaN"
> tester1[is.nan(tester1)] = NA
> tester1 
[1] "2"   "2"   "3"   "4"   "2"   "3"   "NaN"
> tester1[is.nan(tester1)] = "NA"
> tester1 
[1] "2"   "2"   "3"   "4"   "2"   "3"   "NaN"

Ответы [ 3 ]

16 голосов
/ 28 февраля 2012

Вот проблема: ваш вектор - символ в режиме, поэтому, конечно, это не число.Этот последний элемент интерпретируется как строка «NaN».Использование is.nan будет иметь смысл, только если вектор числовой.Если вы хотите, чтобы значение отсутствовало в символьном векторе (чтобы оно правильно обрабатывалось функциями регрессии), тогда используйте (без кавычек) NA_character_.

> tester1 <- c("2", "2", "3", "4", "2", "3", NA_character_)
>  tester1
[1] "2" "2" "3" "4" "2" "3" NA 
>  is.na(tester1)
[1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

Ни "NA", ни«NaN» действительно отсутствуют в символьных векторах.Если по какой-то причине в факторной переменной были значения, которые были «NaN», вы могли бы просто использовать логическое индексирование:

tester1[tester1 == "NaN"] = "NA"  
# but that would not really be a missing value either 
# and it might screw up a factor variable anyway.

tester1[tester1=="NaN"] <- "NA"
Warning message:
In `[<-.factor`(`*tmp*`, tester1 == "NaN", value = "NA") :
invalid factor level, NAs generated
##########
tester1 <- factor(c("2", "2", "3", "4", "2", "3", NaN))

> tester1[tester1 =="NaN"] <- NA_character_
> tester1
[1] 2    2    3    4    2    3    <NA>
Levels: 2 3 4 NaN

Этот последний результат может быть удивительным.Есть оставшийся уровень "NaN", но ни один из элементов не является "NaN".Вместо этого элемент, который был "NaN", теперь является реальным отсутствующим значением, обозначенным в печати как.

6 голосов
/ 28 февраля 2012

Вы не можете иметь NaN в векторе символов, что у вас есть здесь:

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN)
> is.nan(tester1)
[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> tester1
[1] "2"   "2"   "3"   "4"   "2"   "3"   "NaN"

Обратите внимание, что R думает, что это строка символов.

Вы можете создать NaN в числовом векторе:

> tester1 <- c("2", "2", "3", "4", "2", "3", NaN)
> as.numeric(tester1)
[1]   2   2   3   4   2   3 NaN
> is.nan(as.numeric(tester1))
[1] FALSE FALSE FALSE FALSE FALSE FALSE  TRUE

Тогда, конечно, R может преобразовать NaN в NA согласно вашему коду:

> foo <- as.numeric(tester1)
> foo[is.nan(foo)] <- NA
> foo
[1]  2  2  3  4  2  3 NA
6 голосов
/ 28 февраля 2012

EDIT:

Гэвин Симпсон в комментариях напоминает мне, что в вашей ситуации есть гораздо более простые способы преобразовать то, что действительно является «NaN», в «NA»:

tester1 <- gsub("NaN", "NA", tester1)
tester1
# [1] "2"  "2"  "3"  "4"  "2"  "3"  "NA"

Решение:

Чтобы определить, какие элементы вектора символов являются NaN, вам необходимо преобразовать вектор в числовой вектор:

tester1[is.nan(as.numeric(tester1))] <- "NA"
tester1
[1] "2"  "2"  "3"  "4"  "2"  "3"  "NA"

Пояснение:

Есть несколько причин, по которым это не работает так, как вы ожидаете.

Во-первых, хотя NaN обозначает «Не число», оно имеет класс "numeric" и имеет смысл только внутри числового вектора.

Во-вторых, когда он включен в символьный вектор, символ NaN автоматически преобразуется в строку символов "NaN". Когда вы затем проверяете его на nan -ness, строка символов возвращает FALSE:

class(NaN)
# [1] "numeric"
c("1", NaN)
# [1] "1"   "NaN"
is.nan(c("1", NaN))
# [1] FALSE FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...