43

の関数で変数名を文字列として使用したいdplyr。以下の例を参照してください。

df <- data.frame( 
      color = c("blue", "black", "blue", "blue", "black"), 
      value = 1:5)
filter(df, color == "blue")

それは完全に機能colorしますが、次のような文字列で参照したいと思います。

var <- "color"
filter(df, this_probably_should_be_a_function(var) == "blue").

なんとしてでもこれを実行できれば幸いです。また、読みやすいdplyr構文を使用できることを非常に嬉しく思います。

4

9 に答える 9

36

UQ新しいバージョンでは、引用符で囲まれた変数を作成してから、評価のために引用符を外す (または!!)ことができます。

var <- quo(color)
filter(df, UQ(var) == "blue")
#   color value
#1  blue     1
#2  blue     3
#3  blue     4

演算子の優先順位により、()ラップアラウンドが必要になる場合があります!!

filter(df, (!!var) == "blue")
#   color value
#1  blue     1
#2  blue     3
#3  blue     4

新しいバージョンで||は優先度が高いので、

filter(df, !! var == "blue")

動作するはずです(@Moody_Mudskipperがコメントしたように)

古いオプション

また、以下を使用する場合があります。

 filter(df, get(var, envir=as.environment(df))=="blue")
 #color value
 #1  blue     1
 #2  blue     3
 #3  blue     4

編集:ソリューションの順序を並べ替えました

于 2014-07-04T08:10:29.593 に答える
7

よく聞かれますが、まだ簡単なサポートはありません。ただし、この投稿に関して:

eval(substitute(filter(df, var == "blue"), 
                list(var = as.name(var))))
#   color value
# 1  blue     1
# 2  blue     3
# 3  blue     4
于 2014-07-04T07:54:24.533 に答える
5

上記の解決策のいくつかはうまくいきませんでした。as.symbolでラップする関数があり!!ます。もう少し単純なようです。

set.seed(123)

df <- data.frame( 
  color = c("blue", "black", "blue", "blue", "black"), 
  shape = c("round", "round", "square", "round", "square"),
  value = 1:5)

次に、変数を文字列として dplyr 関数に入力しますas.symbol()!!

var <- "color"
filter(df, !!as.symbol(var) == "blue")

#   color  shape value
# 1  blue  round     1
# 2  blue square     3
# 3  blue  round     4

var <- "shape"
df %>% group_by(!!as.symbol(var)) %>% summarise(m = mean(value))

#   shape      m
#   <fct>  <dbl>
# 1 round   2.33
# 2 square  4
于 2020-02-04T00:41:45.537 に答える