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

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

Например:

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

Дайте мне предупреждение, потому что он вводил NAs путем принуждения. Я хочу, чтобы NAs вводились принуждением - есть ли способ сказать это "да, это то, что я хочу сделать". Или я должен просто жить с предупреждением?

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

Ответ 1

Используйте suppressWarnings():

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

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

Ответ 2

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

В целом подавление предупреждений не является лучшим решением, поскольку вы можете быть предупреждены, когда будет предоставлен неожиданный ввод.
Нижеприведенное решение представляет собой оболочку для поддержки только 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

Ответ 4

Вы можете использовать библиотеку stringr.

library(tidyverse) #For piping 
library(stringr) #Note: it part of "tidyverse"

  c("1", "2", "X") %>%
    stringr::str_extract_all("\\(?[0-9,.]+\\)?") %>% 
    as.numeric()

Ответ 5

У меня была та же проблема со столбцом фрейма данных, который я хотел использовать для оси y диаграммы рассеяния ggplot2, но вот как я решил ее:

as.numeric(as.factor(columnName))

Вы также можете найти это полезным вместо использования suppressWarnings()