web-dev-qa-db-ja.com

TRUE、FALSE、NA、NaNの処理

これがベクトルです

a <- c(TRUE, FALSE, FALSE, NA, FALSE, TRUE, NA, FALSE, TRUE)

「a」にTRUEがあるたびにTRUEを返し、FALSEまたはFALSEがあるたびにNAを返す単純な関数が欲しい[$ var] _ in "a"。

次の3つのことは機能しません

a == TRUE
identical(TRUE, a)
isTRUE(a)

ここに解決策があります

a[-which(is.na(a))]

しかし、それは簡単で簡単な解決策ではないようです

別の解決策はありますか?

私が知っているいくつかの関数(および演算子)は次のとおりです。

identical()
isTRUE()
is.na()
na.rm()
&
|
!
  • TRUEFALSENANaNを扱うのに役立つ他の関数(演算子、ヒントなど)は何ですか?

  • NANaNの違いは何ですか?

  • TRUEFALSENA、およびNaN以外の「論理的なもの」はありますか?

どうもありがとう !

26
Remi.b

質問に順番に回答するには:

1)==演算子は、NAを期待どおりに処理しません。非常に便利な関数は、このcompareNA関数です r-cookbook.com

  compareNA <- function(v1,v2) {
    # This function returns TRUE wherever elements are the same, including NA's,
    # and false everywhere else.
    same <- (v1 == v2)  |  (is.na(v1) & is.na(v2))
    same[is.na(same)] <- FALSE
    return(same)
   }

2)NAは「使用不可」の略で、一般的なNaN(「not a number」)とは異なります。一般的に、NAは欠損データを表す番号のデフォルト値に使用されます。 NaNは通常、数値の問題(-1または同様のログを取る)のために生成されます。

3)「論理的なこと」の意味がよくわかりません。数値ベクトルなど、さまざまなデータ型を論理演算子への入力として使用できます。 R論理演算子ページ http://stat.ethz.ch/R-manual/R-patched/library/base/html/Logic.html を読んでみてください。

お役に立てれば!

11
ben

関数で何かをラップする必要はありません-次のように動作します

a = c(T,F,NA)

a %in% TRUE

[1]  TRUE FALSE FALSE
50
wjchulme

したがって、TRUEをTRUEに、FALSEをFALSEにしたい場合、唯一の本当の変更はNAがFALSEになる必要があることです。

a[ is.na(a) ] <- FALSE

または、TRUEであり、欠落していない場合にのみTRUEであると言い換えることができます。

a <- a & !is.na(a)
6
Greg Snow

上記のBen Bolkerの提案を受けて、is.na()構文に従って独自の関数を設定できます

is.true <- function(x) {
  !is.na(x) & x
}

a = c(T,F,F,NA,F,T,NA,F,T)

is.true(a)
[1]  TRUE FALSE FALSE FALSE FALSE  TRUE FALSE FALSE  TRUE

これは、サブセット化データにも機能します。

b = c(1:9)
df <- as.data.frame(cbind(a,b))

df[is.true(df$a),]

  a b
1 1 1
6 1 6
9 1 9

また、データ内にNAが存在する場所に誤って空の行を組み込むことを防ぎます。

df[df$a == TRUE,]

      a  b
1     1  1
NA   NA NA
6     1  6
NA.1 NA NA
9     1  9
6
JWilliman