Ответ 1
Используйте suppressWarnings()
:
suppressWarnings(as.numeric(c("1", "2", "X")))
[1] 1 2 NA
Это подавляет предупреждения.
Я обычно предпочитаю код R, чтобы не получать предупреждения, но я не знаю, как избежать предупреждения при использовании as.numeric
для преобразования символьного вектора.
Например:
x <- as.numeric(c("1", "2", "X"))
Дайте мне предупреждение, потому что он вводил NAs путем принуждения. Я хочу, чтобы NAs вводились принуждением - есть ли способ сказать это "да, это то, что я хочу сделать". Или я должен просто жить с предупреждением?
Или я должен использовать другую функцию для этой задачи?
Используйте suppressWarnings()
:
suppressWarnings(as.numeric(c("1", "2", "X")))
[1] 1 2 NA
Это подавляет предупреждения.
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
В целом подавление предупреждений не является лучшим решением, поскольку вы можете быть предупреждены, когда будет предоставлен неожиданный ввод.
Нижеприведенное решение представляет собой оболочку для поддержки только 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
Вы можете использовать библиотеку stringr
.
library(tidyverse) #For piping
library(stringr) #Note: it part of "tidyverse"
c("1", "2", "X") %>%
stringr::str_extract_all("\\(?[0-9,.]+\\)?") %>%
as.numeric()
У меня была та же проблема со столбцом фрейма данных, который я хотел использовать для оси y диаграммы рассеяния ggplot2, но вот как я решил ее:
as.numeric(as.factor(columnName))
Вы также можете найти это полезным вместо использования suppressWarnings()