1. ホーム
  2. r

[解決済み] なぜ `[`] は `subset` よりも優れているのですか?

2022-03-23 10:40:16

質問

data.frameをフィルタリングする、つまり特定の条件を満たす行を抽出する必要がある場合、私は好んで subset という関数があります。

subset(airquality, Month == 8 & Temp > 90)

よりも、むしろ [ 関数を使用します。

airquality[airquality$Month == 8 & airquality$Temp > 90, ]

私が好む理由は、大きく分けて2つあります。

  1. コードが左から右へと読みやすくなるんです。Rのことを何も知らない人でも subset という文があります。

  2. カラムは変数として参照できるので select を使えば、キーストロークをいくつか節約できます。上の例では、次のように入力するだけでした。 airquality で一度だけ subset で3回。 [ .

を使って、幸せに暮らしていたわけです。 subset なぜなら、その方が短くて読みやすいからで、Rコーダー仲間にその素晴らしさを説いているほどです。しかし、昨日、私の世界は崩壊した。を読みながら subset のドキュメントで、この部分に気がついた。

警告

この関数は対話的に使用することを目的とした便利な関数です。プログラミングには、[ のような標準的なサブセット関数を使用した方が良いでしょう。特に、引数サブセットの非標準的な評価は、予期しない結果をもたらすことがあります。

どなたか、著者の言いたいことを明確にしていただけませんか?

まず、「"」とはどういう意味なのか。 インタラクティブに使用するために とは何ですか?BATCH モードで実行されるスクリプトとは対照的に、インタラクティブなセッションというのは知っていますが、どのような違いがあるのかわかりません。

では、「"」についてご説明ください。 引数 subset の非標準的な評価 と、なぜそれが危険なのか、例を挙げて説明してください。

解決方法は?

この質問に対しては、@James がコメントで、Hadley Wickham の素晴らしい解説を紹介し、その危険性を説明しています。 subset (といった関数)。 [ここ]に . 読んできてください。

少し長いので、ハドレーが使っている例の中で、「何が悪いのか」という問いに最も直接的に触れているものをここに記録しておくとよいでしょう。

Hadleyは次のような例を提示しています。次の関数を使用してデータフレームをサブセットし、並べ替えたいとします。

scramble <- function(x) x[sample(nrow(x)), ]

subscramble <- function(x, condition) {
  scramble(subset(x, condition))
}

subscramble(mtcars, cyl == 4)

これはエラーを返します。

eval(expr, envir, enclos)でエラー:オブジェクト 'cyl' が見つかりません。

というのも、R はもはや 'cyl' というオブジェクトがどこにあるのか "know" 知らないからです。また、偶然にもグローバル環境に 'cyl' というオブジェクトがあった場合、本当に奇妙なことが起こる可能性があることも指摘されています。

cyl <- 4
subscramble(mtcars, cyl == 4)

cyl <- sample(10, 100, rep = T)
subscramble(mtcars, cyl == 4)

(実行してみて、自分で確かめてみてください。かなりおかしいです)