web-dev-qa-db-ja.com

$の論理ベクトルを使用してデータフレームをサブセット化します

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$yx[["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未満であり、したがって返される必要があるため、その基準を満たしていました。

5
Richard Golz

操作を段階的に分解してみてください。

_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
_
7
Sun Bee

$[[はどちらも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' 
1
MKR