Як уникнути попередження при введенні НС з примусу


124

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

Наприклад:

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

Надішле мені попередження, оскільки воно запровадило НС з примусу. Я хочу, щоб НС запроваджені примусово - чи є спосіб сказати це "так, це я хочу зробити". Або я просто живу з попередженням?

Або я повинен використовувати іншу функцію для цього завдання?


8
Бачите, ?suppressWarningsможливо?
A5C1D2H2I1M1N2O1R2T1

4
У чому проблема цього попередження? Як правило, це дає цінну інформацію. Я віддаю перевагу більш багатослівний вихід на консолі R перед неприємними сюрпризами.
Roland

12
@Roland Я повністю згоден, але корисність попереджень зменшується, якщо ти звикаєш просто ігнорувати їх. Ось чому я, як правило, люблю "братися за попередження". У цьому випадку я ВИНАГА генерую попередження, і багато з них - мої дані надходять у вигляді рядків з "X", що представляє NA, і ця функція робить саме те, що я хочу робити. Я хотів сказати "Дякую, що повідомили мені, але це нормально, я знаю, що роблю". suppressWarningsздається ідеальним.
Короне

6
Ви знаєте, що read.tableприймає аргумент na.strings?
Roland

Їх корисно придушити, якщо у вас уже є робота над відомою помилкою в бібліотеці. Ось як я буду цим користуватися!
Клем Ван

Відповіді:


142

Використання suppressWarnings():

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

Це пригнічує попередження.


Хоча це найкраща відповідь, відповідь янгорецьких нижче здається мені більш твердою.
Ян

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прекрасно працює на прикладі оп, але один застереження для кожного, хто бачить цю нитку в майбутньому, - це те, що destringпрацює інакше, ніж as.numericтоді, коли цільовий рядок є сумішшю рядків і числових: тобто destring("x1")дає, 1але as.numeric("x1")даєNA
Hong

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

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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.