web-dev-qa-db-ja.com

ベクトルからNA値を削除する

私はいくつかのNA値を持つ巨大なベクトルを持っています、そして私はそのベクトルの中で最大値を見つけようとしています(ベクトルはすべての数です)、しかし私はNA値のためこれをすることができません。

最大値を計算するためにNAの値を削除する方法を教えてください。

167
CodeGuy

?maxを試すと、実際にはna.rm =引数があり、デフォルトではFALSEに設定されています。 (これはsum()mean()などを含む他の多くのR関数の一般的なデフォルトです)

na.rm=TRUEを設定することはあなたが求めていることだけをします:

d <- c(1, 100, NA, 10)
max(d, na.rm=TRUE)

NAをすべて削除したい場合は、代わりにこのイディオムを使用してください。

d <- d[!is.na(d)]

最後の注意:他の関数(例えばtable()lm()、およびsort())は、異なる名前を使用する(そして異なるオプションを提供する)NA関連の引数を持ちます。そのため、NAが関数呼び出しで問題を引き起こす場合は、関数の引数の中に組み込みの解決策があるかどうかをチェックする価値があります。私は通常がすでにそこにあるのを見つけました。

233
Josh O'Brien

na.omit関数は、多くの回帰ルーチンが内部で使用しているものです。

vec <- 1:1000
vec[runif(200, 1, 1000)] <- NA
max(vec)
#[1] NA
max( na.omit(vec) )
#[1] 1000
82
42-

?maxは、TRUEに設定できる追加のパラメーターna.rmがあることを示しています。

それとは別に、あなたが本当にNAsを削除したいのなら、以下のようにしてください。

myvec[!is.na(myvec)]
17
Nick Sabbe

max(vector, na.rm = TRUE)を呼び出すことができます。より一般的には、na.omit()関数を使うことができます。

13
Michael Hoffman

万が一Rに不慣れな人が、元の質問に対する簡単な答えを求めている場合

ベクトルからNA値を削除する方法

ここにあります:

次のようにベクトルfooがあるとします。

foo = c(1:10, NA, 20:30)

length(foo)を実行すると22になります。

nona_foo = foo[!is.na(foo)]

NA値が削除されたため、length(nona_foo)は21です。

is.na(foo)はブール値の行列を返すので、この値の反対でfooをインデックスするとNAではないすべての要素が得られます。

12
Scott C Wilson

discard frompurrr を使用します(リストとベクターで動作します)。

discard(v, is.na) 

利点は、パイプが使いやすいことです。または、組み込みのサブセット関数[を使用します。

v %>% discard(is.na)
v %>% `[`(!is.na(.))
1
qwr