11

一連のカテゴリ変数を含むデータ フレームがあります。それらのいくつかにはNAが含まれており、addNA関数を使用してそれらを明示的な因子レベルに変換します。私の問題は、それらを登録していないように見える NA として処理しようとしたときに発生します。

これが私のデータセットの例で、NA を「検索」しようとしています。

df1 <- data.frame(id = 1:200, y =rbinom(200, 1, .5),
                  var1 = factor(rep(c('abc','def','ghi','jkl'),50)))
df1$var2 <- factor(rep(c('ab c','ghi','jkl','def'),50))
df1$var3 <- factor(rep(c('abc','ghi','nop','xyz'),50))

df1[df1$var1 == 'abc','var1'] <- NA

df1$var1 <- addNA(df1$var1)

df1$isNaCol <- ifelse(df1$var1 == NA, 1, 0);summary(df1$isNaCol)
df1$isNaCol <- ifelse(is.na(df1$var1), 1, 0);summary(df1$isNaCol)
df1$isNaCol <- ifelse(df1$var1 == 'NA', 1, 0);summary(df1$isNaCol)
df1$isNaCol <- ifelse(df1$var1 == '<NA>', 1, 0);summary(df1$isNaCol)

また、入力??addNAしても一致しません。これはグレーマーケット機能か何かですか?任意の提案をいただければ幸いです。

4

3 に答える 3

5

これは、 への呼び出しの前にaddNA()OP のデータで行われることに注意してください。

addNA()このデータで何が行われるかを確認することは有益です。

> head(df1$var1)
[1] <NA> def  ghi  jkl  <NA> def 
Levels: abc def ghi jkl
> levels(df1$var1)
[1] "abc" "def" "ghi" "jkl"
> head(addNA(df1$var1))
[1] <NA> def  ghi  jkl  <NA> def 
Levels: abc def ghi jkl <NA>
> levels(addNA(df1$var1))
[1] "abc" "def" "ghi" "jkl" NA

addNA欠落度 ( ) がデフォルトで R がそれを無視するレベルになるように因子のレベルを変更しています。それはまた、情報を取り除きます - ある意味では、それはもはや未知ではなく、「欠落」カテゴリーの一部です。NANANA

私たちのヘルプを見てaddNAください?addNA

の定義addNAを見ると、それがしているのはレベルの変更だけであることがわかります

of the factor, not changing the data any:

> addNA
function (x, ifany = FALSE) 
{
    if (!is.factor(x)) 
        x <- factor(x)
    if (ifany & !any(is.na(x))) 
        return(x)
    ll <- levels(x)
    if (!any(is.na(ll))) 
        ll <- c(ll, NA)
    factor(x, levels = ll, exclude = NULL)
}

それ以外の場合、データは変更されないことに注意してください - それらNAはまだ因子に残っています。addNAviaのほとんどの動作を複製できます。

with(df1, factor(var1, levels = c(levels(var1), NA), exclude = NULL))

> head(with(df1, factor(var1, levels = c(levels(var1), NA), exclude = NULL)))
[1] <NA> def  ghi  jkl  <NA> def 
Levels: abc def ghi jkl <NA>

ただし、NAがレベルになったため、これらのエントリは欠落しているとは示されis.na()ませis.na()

あなたが得られる唯一の利点は、それがすでに1つとして存在している場合、それがレベルとしてaddNA追加されないことです. NAまた、データに sがない場合は、 を介してレベルとしてのifany追加を停止できます。NANA

間違っているのはNA、通常の比較方法を使用して何かと比較しようとすることです(2番目の例を除く)。どのような価値と観察が必要なのかわからない場合NA、どのようにそれを何かと比較できますか? の内部表現以外ではできませんNA。これはis.na()関数によって行われることです:

> with(df1, head(is.na(var1), 10))
 [1]  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE

したがって、私はそうします(addNA まったく使用せずに)

df1 <- transform(df1, isNaCol = is.na(var1))

> head(df1)
  id y var1 var2 var3 isNaCol
1  1 1 <NA> ab c  abc    TRUE
2  2 0  def  ghi  ghi   FALSE
3  3 0  ghi  jkl  nop   FALSE
4  4 0  jkl  def  xyz   FALSE
5  5 0 <NA> ab c  abc    TRUE
6  6 1  def  ghi  ghi   FALSE

1それを, , 変数にしたい場合は、次0のように追加するだけas.numeric()です

df1 <- transform(df1, isNaCol = as.numeric(is.na(var1)))

あなたが本当に間違っていると思うのはNA、要因にレベルを付けたいということです。のようaddNA()なもので使用するための便利な関数と見なしtable()ますが、それには の事前の使用を必要としない引数がありますaddNA()

> with(df1, table(var1, useNA = "ifany"))
var1
 abc  def  ghi  jkl <NA> 
   0   50   50   50   50
于 2013-06-25T16:18:26.540 に答える
5

NA通常の比較演算子で と等しいかどうかをテストすると、常にNA---you wantが得られますis.na。さらに、各レベル インデックス (そのインデックスに関連付けられた値ではない) をテストで呼び出すため、最初に をベクトルに変換する必要is.naがあります。factorfactorcharacter

df1$isNaCol <- ifelse(is.na(as.character(df1$var1)), 1, 0);summary(df1$isNaCol)
于 2013-06-25T16:10:14.280 に答える
4

NA と比較されるものはすべて NA です。これが、最初の要約がすべて NA である理由です。

このaddNA関数は、因子内の NA オブザベーションを新しいレベルに変更します。このレベルには、(キャラクターモードの) NAというラベルが付けられます。基になる変数自体には NA がありません。これが、2 番目のサマリーがすべて 0 である理由です。

NA レベルの観測値の数を確認するには、Matthew Plourde が投稿したものを使用します。

于 2013-06-25T16:16:50.147 に答える