web-dev-qa-db-ja.com

NA値とR集約関数

欠損値のある単純なデータフレームを次に示します。

M = data.frame( Name = c('name','name'), Col1 = c(NA,1) , Col2 = c(1,1))

このように集約をMに適用すると:

aggregate(.~Name, M, FUN=sum, na.rm=TRUE)

結果は次のとおりです。

_RowName Col1 Col2
name    1    1
_

したがって、最初の行全体が無視されます。しかし、もし私が

aggregate(M[,2:3], by=list(M$Name), FUN=sum, na.rm=TRUE)

結果は

_Group.1 Col1 Col2
name    1    2
_

したがって、(1,1)エントリのみが無視されます。

これらの2つの呼び出しは同等だと思っていたため、これは私のコードの1つで大きなデバッグの頭痛の種となりました。 「式」入力メソッドが異なる方法で処理される理由はありますか?

ありがとう。

40
Ryan Walker

良い質問ですが、私の意見では、これはaggregateのマニュアルページの複数の場所に非常に明確に文書化されているため、majorデバッグの頭痛を引き起こすべきではありません。

まず、使用法セクションで:

## S3 method for class 'formula'
aggregate(formula, data, FUN, ...,
          subset, na.action = na.omit)

後で、説明で:

na.action:データにNA値が含まれる場合に何が起こるかを示す関数。デフォルトでは、指定された変数の欠損値は無視されます。


私は答えられませんなぜ式モードは異なって書かれました---それは関数の作者が答えなければならないことです---しかし、上記の情報を使用すると、おそらく以下を使用できます:

aggregate(.~Name, M, FUN=sum, na.rm=TRUE, na.action=NULL)
#   Name Col1 Col2
# 1 name    1    2
47

数式バージョンを同等にしたい場合は、これを試してください:

M = data.frame( Name = rep('name',5), Col1 = c(NA,rep(1,4)) , Col2 = rep(1,5))
aggregate(. ~ Name, M, function(x) sum(x, na.rm=TRUE), na.action = na.pass)
17
jenesaisquoi