web-dev-qa-db-ja.com

可変列名に基づくサブセット

テストする列の名前がわからない場合、subset関数をどのように使用するのか疑問に思っています。シナリオは次のとおりです。ユーザーがデータテーブルをフィルター(サブセット)する変数を選択できるShinyアプリがあります。入力としてwebappから列名を受け取り、次のようにその列の値に基づいてサブセット化します。

subset(myData, THECOLUMN == someValue)

THECOLUMNsomeValueの両方が変数である場合を除きます。目的の列名を文字列として渡すための構文はありますか?

列名を保持する変数ではなく、列名であるベアワードが必要なようです。

25
adv12

これが、subsetがインタラクティブな使用以外の悪いツールである理由です。

d <- data.frame(x = letters[1:5],y = runif(5))
> d[d[,'x'] == 'c',]
  x         y
3 c 0.3080524

基本的に、Rでの抽出は[を中心に構築されます。これを使って。

22
joran

subsetwithは両方ともインタラクティブに使用するように設計されており、他の機能内での使用に対する警告はヘルプページに記載されています。これは、データ引数の名前から構築された環境内の式としての評価引数の戦略に由来します。そうでなければ、これらの列/要素名は、Rセンスの「オブジェクト」ではありません。

THECOLUMNが値が列の名前であるオブジェクトの名前であり、someValueが値がターゲットであるオブジェクトの名前である場合、以下を使用する必要があります。

dfrm[ dfrm[[THECOLUMN]] == someValue , ]

「[[」がその引数を評価するという事実は、プログラミングに関して「$」よりも優れている理由です。 joranの例を使用する場合:

 d <- data.frame(x = letters[1:5],y = runif(5))
 THECOLUMN= "x"
 someValue= "c"

d[ d[[THECOLUMN]] == someValue , ]
#   x         y
# 3 c 0.7556127

したがって、この場合、これらはすべて同じアトミックベクトルを返します。

d[[ THECOLUMN ]]
d[[ 'x' ]]
d[ , 'x' ]
d[, THECOLUMN ]
d$x  # of the three extraction functions: `$`, `[[`, and `[`,
     # only `$` is unable to evaluate its argument
25
42-

次のワンライナーを使用できると思います。

myData[ , grep(someValue, colnames(myData))]

どこ

colnames(myData)

すべての列名を含むベクトルを出力し、

grep(someValue, colnames(myData))

列を指す長さ1の数値ベクトル(列名が一意である場合)になります。見る ?grep Rでのパターンマッチングに関する情報.

4
mcmunder