2013-02-20 29 views
77

我通常更喜歡編碼R,以免得到警告,但我不知道如何避免在使用as.numeric轉換字符向量時發出警告。如何通過強制引入NAs時避免警告

例如:

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

能不能給我一個警告,因爲它推出來港受到脅迫。我希望通過強制方式引入新加坡 - 有沒有辦法告訴它「是這就是我想要做的事情」。或者我應該接受警告嗎?

或者我應該爲這項任務使用不同的功能?

+7

見'?也許suppressWarnings'? – A5C1D2H2I1M1N2O1R2T1 2013-02-20 16:32:40

+3

這個警告有什麼問題?通常它會提供有價值的信息我更喜歡R控制檯中的更詳細的輸出來討厭令人驚訝的事情。 – Roland 2013-02-20 16:53:15

+11

@Roland我完全同意,但如果你習慣於忽略它們,警告的用處就會減少。這就是爲什麼我一般喜歡「解決」警告。在這種情況下,我會一直生成警告,並且會有很多警告 - 我的數據以「X」代表NA的字符串進入,所以函數正在按照我希望的方式執行。我想說「謝謝你讓我知道,但沒關係,我知道我在做什麼」。 'suppressWarnings'似乎很完美。 – Corone 2013-02-20 16:56:12

回答

106

使用suppressWarnings()

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

這抑制了警告。

26

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 
+0

只是一個快速的點 - 我使用這個通過從raRifx中分離出destring函數並將其定義爲我自己的函數(當它發生時,在另一個函數中),它允許我堅持基於R @Ari – user1945827 2015-02-01 10:35:28

+0

完全合法。你可以在這裏找到這個函數:https://github.com/gsk3/taRifx/blob/master/R/Rfunctions.R#L1161 – 2015-02-02 12:32:41

+0

謝謝。我在我設置的功能中引用了taRifx和destring,但我懷疑它會被髮布... – user1945827 2015-02-02 16:25:09

12

一般來說,抑制警告並不是最好的解決方案,因爲您可能希望在提供某些意外輸入時發出警告。
下面的解決方案是在數據類型轉換過程中僅維護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 
+1

這是最好的答案。使用'suppressWarnings()'通常是一個壞主意,因爲我們有時需要看到這些警告。 – keberwein 2017-09-26 18:49:30