強制によるNAの導入時に警告を回避する方法


124

私は通常、警告を受け取らないようにRをコーディングすることを好みますが、を使用as.numericして文字ベクトルを変換するときに警告を受け取らないようにする方法がわかりません。

例えば:

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

強制によってNAを導入したため、警告が表示されます。私は強制によって導入されたNAを望んでいます-「はい、これが私がやりたいことです」とそれを伝える方法はありますか。または私は警告とともに生きるべきですか?

または、このタスクに別の関数を使用する必要がありますか?


8
参照してください。?suppressWarningsおそらく?
A5C1D2H2I1M1N2O1R2T1 2013

4
この警告の問題は何ですか?一般的に、それは貴重な情報を提供します。厄介な驚きよりも、Rコンソールでのより詳細な出力を好みます。
ローランド

12
@Roland私は完全に同意しますが、警告を無視することに慣れると、警告の有用性は低下します。そのため、私は一般的に警告に「取り組む」ことが好きです。この場合、私は常に警告とその多くを生成します-私のデータはNAを表す "X"の文字列として入ってくるので、関数はまさに私がしたいことをしています。「知らせてくれてありがとうございますが、何をしているのかわかっていても大丈夫です」と言いたかった。 suppressWarnings完璧なようです。
Korone、

6
あなたはそれread.tableが引数を受け入れることを知っていますna.stringsか?
ローランド

ライブラリの既知のバグの回避策をすでに持っている場合は、それらを抑制すると便利です。それが私がこれを使う方法です!
Clem Wang

回答:


142

使用suppressWarnings()

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

これは警告を抑制します。


これは推奨される応答ですが、以下のjangoreckiによる応答は、私には、より堅実に思えます。
イアン

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

2
私は、これは古いスレッドですし、知っているdestringオペアンプの例のために完璧に動作しますが、将来的には、このスレッドを見ている人のための1つの警告が、そのあるdestringから、作品は異なるas.numericターゲット文字列は、文字列と数値の混合物であるとき:、あるdestring("x1")与えます1が、as.numeric("x1")提供しますNA
香港

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 2017

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.