これは、この質問に続いて尋ねるべきだと思ったものです。R-forge トラッカーに報告する前に、これがバグ/不一致であるかどうかを確認したいと思います。
これを考慮してくださいdata.table
:
require(data.table)
DT <- data.table(x=c(1,0,NA), y=1:3)
ここで、0 ではないDT のすべての行にアクセスするには、次の方法で行うことができます。
DT[x != 0]
# x y
# 1: 1 1
DT[!(x == 0)]
# x y
# 1: 1 1
# 2: NA 3
基礎となる論理演算が同等である場合にアクセスするDT[x != 0]
と、異なる結果が得られます。DT[!(x==0)]
注:これを data.frame に変換してこれらの操作を実行すると、論理的に同等の両方の操作で互いに同一の結果が得られますが、その結果はこれらの data.table の両方の結果とは異なります。理由の説明については?`[`
、セクションの下を参照してNAs in indexing
ください。
編集:との同等性を強調している人もいるのでdata.frame
、data.frame での同じ操作からの出力のスニペットを次に示します。
DF <- as.data.frame(DT)
# check ?`[` under the section `NAs in indexing` as to why this happens
DF[DF$x != 0, ]
# x y
# 1 1 1
# NA NA NA
DF[!(DF$x == 0), ]
# x y
# 1 1 1
# NA NA NA
これは矛盾していると思いますが、どちらも同じ結果になるはずです。しかし、どの結果ですか?のドキュメントに[.data.table
は次のように書かれています:
i ---> 整数、logical または文字ベクトル、列名の式、list または data.table。
整数ベクトルと論理ベクトルは、[.data.frame. 論理 i の NA 以外は FALSE として扱われ、[.data.frame.
で同じ操作を行った場合と結果が異なる理由は明らかdata.frame
です。それでも、data.table 内では、これが当てはまる場合、両方が返されます。
# x y
# 1: 1 1
[.data.table
ソースコードを調べて、なぜこれが起こっているのか理解しました。なぜこれが起こっているのかについての詳細な説明については、この投稿を参照 してください。
簡単に言えば、x != 0
「論理的」と評価されNA
、FALSE に置き換えられます。ただし、!(x==0)
は最初(x == 0)
に論理的に評価されNA
、FALSE に置き換えられます。次に、否定が発生し、NA
基本的に になりTRUE
ます。
それで、私の最初の(またはむしろ主な)質問は、これはバグ/矛盾ですか?もしそうなら、data.table R-forge トラッカーにファイルします。そうでない場合は、この違いの理由を知りたいです。また、この違いを説明するドキュメントの修正を提案したいと思います (すでに素晴らしいドキュメントです!)。
編集:data.table
コメントをフォローアップすると、2 番目の質問はNA
、data.frame
?? (しかし、@Rolandのコメントに従って、これは意見につながる可能性が非常に高く、この質問にまったく答えなくてもまったく問題ありません)。