web-dev-qa-db-ja.com

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

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

例えば:

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

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

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

99
Corone

suppressWarnings()を使用します。

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

これにより、警告が抑制されます。

123
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
31
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

Ggplot2散布図のy軸に使用したいデータフレーム列で同じ問題が発生しましたが、ここでそれを解決しました。

as.numeric(as.factor(columnName))

suppressWarnings()を使用する代わりに、これも役立つかもしれません

1
T.M

ライブラリ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