Как избежать предупреждения при внедрении НА путем принуждения

124

Обычно я предпочитаю кодировать R, чтобы не получать предупреждений, но я не знаю, как избежать предупреждения при использовании as.numericдля преобразования вектора символов.

Например:

x <- as.numeric(c("1", "2", "X"))

Предупреждаю, потому что NA вводится по принуждению. Я хочу, чтобы НА вводились путем принуждения - есть ли способ сказать им: «Да, это то, что я хочу делать». Или мне просто жить с предупреждением?

Или мне следует использовать другую функцию для этой задачи?

Korone
источник
8
Видеть ?suppressWarningsвозможно?
A5C1D2H2I1M1N2O1R2T1
4
В чем проблема с этим предупреждением? Обычно это дает ценную информацию. Я предпочитаю более подробный вывод в консоли R неприятным сюрпризам.
Роланд
12
@Roland Я полностью согласен, но полезность предупреждений уменьшается, если вы привыкаете просто игнорировать их. Вот почему я вообще люблю «разбираться» с предупреждениями. В этом случае я ВСЕГДА буду генерировать предупреждения, и многие из них - мои данные поступают в виде строк с «X», представляющим NA, и поэтому функция делает именно то, что я хочу. Я хотел сказать: «Спасибо, что сообщили, но ничего страшного, я знаю, что делаю». suppressWarningsкажется идеальным.
Korone
6
Вы знаете, что read.tableдопускаете аргументы na.strings?
Роланд
Их полезно подавить, если у вас уже есть работа над известной ошибкой в ​​библиотеке. Вот как я собираюсь это использовать!
Клем Ван

Ответы:

142

Использование suppressWarnings():

suppressWarnings(as.numeric(c("1", "2", "X")))
[1]  1  2 NA

Это подавляет предупреждения.

Andrie
источник
Хотя это предпочтительный ответ, нижеприведенный ответ Янгорецки кажется мне более убедительным.
Ян
34

suppressWarnings()уже упоминалось. Альтернативный вариант - сначала вручную преобразовать проблемные символы в NA. Для вашей конкретной проблемы taRifx::destringделает именно это. Таким образом, если вы получите другое, неожиданное предупреждение из вашей функции, оно не будет подавлено.

> library(taRifx)
> x <- as.numeric(c("1", "2", "X"))
Warning message:
NAs introduced by coercion 
> y <- destring(c("1", "2", "X"))
> y
[1]  1  2 NA
> x
[1]  1  2 NA
Ари Б. Фридман
источник
3
Я знаю, что это старый поток и destringотлично работает для примера op, но одно предостережение для всех, кто увидит этот поток в будущем, заключается в том, что он destringработает иначе, чем as.numericкогда целевая строка представляет собой смесь строки и числа: то есть destring("x1")дает, 1но as.numeric("x1")даетNA
Гонконг
26

В общем, подавление предупреждений - не лучшее решение, так как вы можете быть предупреждены, когда будет предоставлен какой-либо неожиданный ввод.
Нижеприведенное решение представляет собой оболочку для поддержки только NA во время преобразования типа данных. Не требует никакого пакета.

as.num = function(x, na.strings = "NA") {
    stopifnot(is.character(x))
    na = x %in% na.strings
    x[na] = 0
    x = as.numeric(x)
    x[na] = NA_real_
    x
}
as.num(c("1", "2", "X"), na.strings="X")
#[1]  1  2 NA
jangorecki
источник
4
Это лучший ответ. Как suppressWarnings()правило, использование - плохая идея, потому что иногда нам нужно видеть эти предупреждения.
keberwein
0

Я немного изменил функцию jangorecki для случая, когда у нас может быть множество значений, которые нельзя преобразовать в число. В моей функции выполняется поиск по шаблону, и если шаблон не найден, возвращается FALSE.! до gperl это означает, что нам нужны те векторные элементы, которые не соответствуют шаблону. В остальном аналогично as.numфункции. Пример:

as.num.pattern <- function(x, pattern){
  stopifnot(is.character(x))
  na = !grepl(pattern, x)
  x[na] = -Inf
  x = as.numeric(x)
  x[na] = NA_real_
  x
}

as.num.pattern(c('1', '2', '3.43', 'char1', 'test2', 'other3', '23/40', '23, 54 cm.'))

[1] 1.00 2.00 3.43   NA   NA   NA   NA   NA
Владислав Шуфинский
источник