it-roy-ru.com

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

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

Например:

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

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

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

94
Corone

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

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

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

118
Andrie

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
29
Ari B. Friedman

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

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

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

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

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

as.numeric(as.factor(columnName))

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

0
T.M