欠損値のある単純なデータフレームを次に示します。
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つで大きなデバッグの頭痛の種となりました。 「式」入力メソッドが異なる方法で処理される理由はありますか?
ありがとう。
良い質問ですが、私の意見では、これは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
数式バージョンを同等にしたい場合は、これを試してください:
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)