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


191

いくつかのNA値を持つ巨大なベクトルがあり、そのベクトルの最大値(ベクトルはすべて数値です)を見つけようとしていますが、NA値が原因でこれを行うことができません。

NA最大値を計算できるように値を削除するにはどうすればよいですか?

回答:


265

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

設定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、関数呼び出しで問題が発生する場合は、関数の引数間で組み込みのソリューションを確認することをお勧めします。通常はすでにそこにあることがわかりました。


これは非常に悪い考えです。これは失敗-Infd、すべてのNAの1つになります。
user3932000

@ user3932000他の人のために明確にするために、あなたの不満は、基本的なR関数max()がどのように動作するかについてです(たとえば、を実行するときmax(c(NA, NA))。個人的には、その振る舞いは妥当だと思います。そのように構成されていて、次のようなことをしたときに期待どおりの結果が得られると思いますa <- c(NA, NA); b <- 1:4; max(c(max(a, na.rm = TRUE), max(b, na.rm = TRUE)))
Josh O'Brien

@ user3932000やや接線方向に、データ解析プラットフォームとしてのRの多くの強みの一つは、失われたデータの洗練されたハンドリング、の結果であり、多くのその著者の一部に慎重に考えました。(このテーマに興味がある場合は、Rのような処理機能をPythonの優れたNumPyパッケージに組み込むことに携わっていたプログラマーの観点から、関連するいくつかの問題についての良い議論については、こちら参照してください。)NA
Joshオブライエン

@ user3932000:その答えは本当に悪いですか?nullセットの最大値をどのように考慮しますか?
クリフAB

@CliffAB上限はありません。最大値を-∞に(そして最小値を+∞に)割り当てることができますが、これは必ずしも望ましいことではなく、直感的でもありません。また、NAsのベクトルからすべてのs を削除NAすると、-∞ではなく空のベクトルが期待されます。
user3932000

94

na.omitこの関数は、回帰ルーチンの多くは内部的に使用するものです。

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

20

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

それとは別に、本当にを削除したい場合はNA、次のように使用します。

myvec[!is.na(myvec)]

3
これが一番だと思います。na.rmとna.omitは、出力にかなりのジャンクを追加します。
MadmanLee 2017

Exceptにna.omitもデータフレームメソッドがあるため、より一般的です。
IRTFM 2019


14

Rの初心者が元の質問に対する簡単な答えを求めている場合に備えて

ベクトルからNA値を削除するにはどうすればよいですか?

ここにあります:

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

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

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

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

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

is.na(foo)ブール行列を返すことを忘れないでください。したがってfoo、この値の反対のインデックスを使用すると、NA以外のすべての要素が得られます。


13

purrrdiscardから使用ます(リストとベクトルで機能します)。

discard(v, is.na) 

利点は、パイプを使いやすいことです。あるいは、組み込みのサブセット機能を使用します[

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

ご了承ください na.omitリストは機能しないて。

> x <- list(a=1, b=2, c=NA)
> na.omit(x)
$a
[1] 1

$b
[1] 2

$c
[1] NA

1

私は2つのbaseアプローチを比較するクイックベンチマークを実行しましたが、それx[!is.na(x)]よりも速いことがわかりましたna.omit。ユーザーqwrは私purrr::dicardも試してみることを提案しました-これは非常に遅いことがわかりました(ただし、実装とテストについて喜んでコメントを取ります!)

microbenchmark::microbenchmark(
  purrr::map(airquality,function(x) {x[!is.na(x)]}), 
  purrr::map(airquality,na.omit),
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)),
  times = 1e6)

Unit: microseconds
                                                     expr    min     lq      mean median      uq       max neval cld
 purrr::map(airquality, function(x) {     x[!is.na(x)] })   66.8   75.9  130.5643   86.2  131.80  541125.5 1e+06 a  
                          purrr::map(airquality, na.omit)   95.7  107.4  185.5108  129.3  190.50  534795.5 1e+06  b 
  purrr::map(airquality, ~purrr::discard(.x, .p = is.na)) 3391.7 3648.6 5615.8965 4079.7 6486.45 1121975.4 1e+06   c

参考までに、x[!is.na(x)]vs の元のテストはna.omit次のとおりです。

microbenchmark::microbenchmark(
    purrr::map(airquality,function(x) {x[!is.na(x)]}), 
    purrr::map(airquality,na.omit), 
    times = 1000000)


Unit: microseconds
                                              expr  min   lq      mean median    uq      max neval cld
 map(airquality, function(x) {     x[!is.na(x)] }) 53.0 56.6  86.48231   58.1  64.8 414195.2 1e+06  a 
                          map(airquality, na.omit) 85.3 90.4 134.49964   92.5 104.9 348352.8 1e+06   b

試してみてくださいpurrr:discard
qwr
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.