Rで$
をサブセット化する際のdata.frame
記号の使用理由と動作の両方を理解するのに問題があります。次の例は私が受講している初心者のクラスで発表されました(ライブの教授と一緒ではないので、そこで尋ねることはできません):
temp_mat <- matrix(1:9, nrow=3)
colnames(temp_mat) <- c('a', 'b', 'c')
temp_df <- data.frame(temp_mat)
temp_df
を呼び出すと、明らかに次のように出力されます。
a b c
1 1 4 7
2 2 5 8
3 3 6 9
コースで与えられた例は次のとおりです。
temp_df[temp_df$c < 10]
どの出力:
a b c
1 1 4 7
2 2 5 8
3 3 6 9
使用理由質問:コースは、$
が部分一致に使用され、x$y
がx[["y", exact=FALSE]]
の完全な代替であることを示しています。ここで部分一致演算子を使用するのはなぜですか? temp_df
に、誤って取得される可能性のある「c」に類似した列が他にないことが確実にわかっているため、これを使用しますか?さらに、部分一致はどのように測定されますか?一致する文字の最小%か何か?不明または類似の列名を持つデータセットを操作する場合にはるかに適切なgetElement
関数があるようです(たとえば、自宅の電話と携帯電話、これらは有効な部分一致と見なされますか?)
動作の質問:上記の例temp_df[temp_df$c < 10]
は、「列cが10未満のtemp_dfから要素のサブセットを返す」と言っているようです。また、すべての列c要素が基準を満たしているため、全体がデータフレームが返されます。 temp_df[temp_df$c < 9]
が返すので、私の解釈は明らかに間違っています:
a b
1 1 4
2 2 5
3 3 6
列cの行1と2の要素は、9未満の基準を満たしていますが、列全体が省略されています。私の質問は2つになります:その論理ベクトルは実際に何を言っているのですか?そして、「列cが9未満のtemp_dfから要素のサブセットを返す」という解釈をどのように記述して、次のように返すのでしょうか。
a b c
1 1 4 7
2 2 5 8
私の考えでは、要素1と2(行1と2)は、列cの値が9未満であり、したがって返される必要があるため、その基準を満たしていました。
操作を段階的に分解してみてください。
_temp_df$c < 9
_
次のようにベクトルを与えます:
_[1] TRUE TRUE FALSE
_
示した方法でこのベクトルを渡すと、temp_df[c(TRUE, TRUE, FALSE)]
は列を操作する効果があります。
_data.frame
_をリストとして考え、列名をキーとして、列の内容をベクトル値として考えます。この操作では、TRUEキー(つまり列)が保持され、FALSEが削除されます。
コンマは、ベクトルを行インデックスとしてマークするのに役立ちます。最初の2行は保持され、最後の行は削除されます。したがって、temp_df[c(TRUE, TRUE, FALSE), ]
は次のようになります。
_ a b c
1 1 4 7
2 2 5 8
_
$
と[[
はどちらもextract
演算子であり、名前で要素を抽出できます。
OPは、exact
引数の動作について1つのクエリを発生させました。 [[
演算子のexact
引数は、RStudio
に次のように記述されています。
文字ベクトルで抽出するときに[[の可能な部分一致を制御します(ほとんどのオブジェクトの場合ですが、「環境」の下を参照してください)。デフォルトは部分一致なしです。値NAは部分一致を許可しますが、発生すると警告を発行します。値FALSEを使用すると、警告なしで部分一致が可能になります。
どういう意味ですか?その動作を理解するために、OPが使用するdata.frameのcolumn names
を次のように変更してみましょう。
names(temp_df) <- c("aa","bb","cc")
#partial name of column will work with exact = FALSE
temp_df[["a", exact = FALSE]]
#[1] 1 2 3
#partial name of column will not work with exact = TRUE
temp_df[["a", exact = TRUE]]
#NULL
temp_df[["a", exact = NA]]
#[1] 1 2 3
#Warning message:
#In .subset2(x, i, exact = exact) : partial match of 'a' to 'aa'