2017-07-13 1 views
0

で関数を配置:変数によってデータフレームを配置する私はdplyrを利用する関数を作成しながら、新しい現状の機能を使用しようと、次の問題に遭遇していますdplyr 0.7.1

df <- tibble(
    g1 = c(1, 1, 2, 2, 2), 
    g2 = c(1, 2, 1, 3, 1), 
    a = sample(5), 
    b = sample(5) 
) 

は簡単です:

my_arrange <- function(df, arrange_var) { 
    quo_arrange_var <- enquo(arrange_var) 
    df %>% 
    arrange(!!quo_arrange_var) 
} 

しかし、優先順を設定する場合はどうすればよいですか?たとえば、任意のアレンジ変数は2を先頭変数とし、通常のソートを行います。 dplyrの以前のバージョンで私が使用します。

arrange(-(arrange_var == 2), arrange_var) 

が、新しい構造に私がアプローチする方法がわからないです。私はまた、quo_nameを使用してみましたが

my_arrange <- function(df, arrange_var) { 
    quo_arrange_var <- enquo(arrange_var) 

    df %>% 
    arrange(-!!quo_arrange_var==2, !!quo_arrange_var) 
} 

を私はエラーに

Error in arrange_impl(.data, dots) : 
    incorrect size (1) at position 1, expecting : 5 

を得る:

my_arrange <- function(df, arrange_var) { 
    quo_arrange_var <- enquo(arrange_var) 

    df %>% 
    arrange(-!!(paste0(quo_name(quo_arrange_var), "==2")), !!quo_arrange_var) 
} 

が、このエラーを取得する:

Error in arrange_impl(.data, dots) : 
    Evaluation error: invalid argument to unary operator. 

私が試してみました任意の助けをいただければ幸いです

答えて

1

最も簡単な解決法は、バンバンの周りにカッコを入れることです。これは、!==に関して演算子の優先順位と関係がある。 !!a==bがある場合、(!!a)==bが必要ですが、それは!!(a==b)として解析されます。何らかの理由で数値をと比較すると、FALSEが返されるので、式はarrange(-FALSE, g2)となり、同じエラーメッセージが表示されます。

my_arrange <- function(df, arrange_var) { 
    quo_arrange_var <- enquo(arrange_var) 

    df %>% 
    arrange(-((!!quo_arrange_var)==2), !!quo_arrange_var) 
} 
my_arrange(df, g2) 
# # A tibble: 5 x 4 
#  g1 g2  a  b 
# <dbl> <dbl> <int> <int> 
# 1  1  2  5  4 
# 2  1  1  2  5 
# 3  2  1  4  3 
# 4  2  1  3  1 
# 5  2  3  1  2 
+0

大変ありがとうございます。 – jonmaestro

関連する問題