3

dplyrR を使用して、文字列名でのみ認識されるデータ フレームの列を操作するプログラミングに取り組んでいます。最近、dplyrクォーシュアなどをサポートするための更新があったことを知っており、新しい「dplyr を使用したプログラミング」記事の関連コンポーネントと思われるものを確認しました: http://dplyr.tidyverse.org/articles/programming .html . しかし、私はまだやりたいことをすることができません。

私の状況は、データ フレームの列名をその文字列名だけで知っているということです。dplyrしたがって、関数内の呼び出しや、実行ごとに列名が変わる可能性のあるスクリプトでさえ、非標準評価を使用することはできません. これを回避する方法を知りたいのですが、新しい引用/引用解除構文で何かを見落としていると思います。

たとえば、データ分布のカットオフ パーセンタイルを定義するユーザー入力があるとします。ユーザーは任意のパーセンタイルを使用してコードを実行でき、選択したパーセンタイルによって出力が変わります。分析内で、中間データ フレームの列が、使用されるパーセンタイルの名前で作成されます。したがって、この列の名前は、ユーザーが入力したカットオフ パーセンタイルに応じて変わります。

以下は、説明するための最小限の例です。カットオフ パーセンタイルのさまざまな値で関数を呼び出したい。という名前のデータ フレームMPGCutoffsに、選択したカットオフ分位 (これは現在、以下のコードで機能します) に従って名前が付けられた列が必要であり、後でこの列名を操作したいと考えています。pctCutoffこの列名の一般性のため、関数を作成する時点では入力に関してしか知ることができないためprobColName、定義済みのパターン ベースに従うによって定義された文字列のみを知っている場合に、それを操作する方法が必要です。の値についてpctCutoff

userInput_prob1 <- 0.95
userInput_prob2 <- 0.9

# Function to get cars that have the "best" MPG
# fuel economy, where "best" is defined by the
# percentile cutoff passed to the function.
getBestMPG <- function( pctCutoff ){

  # Define new column name to hold the MPG percentile cutoff.
  probColName <- paste0('P', pctCutoff*100)

  # Compute the MPG percentile cutoff by number of gears.
  MPGCutoffs <- mtcars %>%
    dplyr::group_by( gear ) %>%
    dplyr::summarize( !!probColName := quantile(mpg, pctCutoff) )

  # Filter mtcars with only MPG values above cutoffs.
  output <- mtcars %>%
    dplyr::left_join( MPGCutoffs, by='gear' ) %>%
    dplyr::filter( mpg > !!probColName ) #****This doesn't run; this is where I'm stuck

  # Return filtered data.
  return(output)
}

best_1 <- getBestMPG( userInput_prob1 )
best_2 <- getBestMPG( userInput_prob2 )

ステートメントは、dplyr::filter()私が適切に実行することができないものです。私はもう試した:

dplyr::filter( mpg > probColName )- エラーはありませんが、行が返されませんでした。

dplyr::filter( mpg > !!probColName )- エラーはありませんが、行が返されませんでした。

関数に次のようなものを渡して、 ;quo(P95)の呼び出しで引用符を外すことができる例も見てきました。dplyr::filter()これで動作するようになりましたが、関数の外で変数名をハードコーディングする必要があるため、問題は解決しません。たとえば、これを行い、ユーザーから渡されたパーセンタイルが 0.90 の場合、作成された列の名前はではなくdplyr::filter()であるため、 への呼び出しは失敗します。P90P95

どんな助けでも大歓迎です。私が見落としている簡単な解決策があることを願っています。

4

2 に答える 2

3

MrFlick の回答 ( https://github.com/tidyverse/rlang/issues/116 ) で参照されている投稿の Hadley のコメントからの代替ソリューションを次に示します。as.name()from base R を使用rlang::sym()すると が置き換えられますが、それでも引用符を外す必要があります。つまり、以下も機能します。

dplyr::filter( mpg > !!as.name(probColName) )

于 2017-09-19T22:17:42.780 に答える