2017-05-26 13 views
0

dplyrで非標準と標準の評価を組み合わせるべきですが、便利な解決策が見つかりませんでした。 data.frameの別の列に基づいてレベルを並べ替える必要があります(視覚化のために必要です)。dplyrでの標準と非標準の評価の組み合わせ

df <- data.frame(A = c(1,2,5,4), B = c("A", "B", "C","D")) 
levels(df$B) 
df2 <- df %>% mutate(B = factor(B, levels = unique(B)[order(A, decreasing = FALSE)])) 
levels(df$B) 

これまでのところ、とても良いです。しかし、今、私はまったく同じタスクを実行したいが、Bは、関数の入力です:

ReorderFactor <- function(column_name){ 
    df2 <- df %>% mutate(column_name = factor(column_name, levels = unique(column_name)[order(A, decreasing = FALSE)])) 
    return(df2) 
} 
ReorderFactor(column_name = "B") 

だから私は、標準および非標準の評価の両方を組み合わせたいです。私はdplyrのアプローチを探しています。

答えて

2

は残念ながら.

ReorderFactor <- function(column_name){ 
    df2 <- df %>% 
    mutate_at(column_name, funs(factor(., levels = unique(.)[order(A, decreasing = FALSE)]))) 
    return(df2) 
} 
2

我々はdplyrのdevelのバージョン(もうすぐ0.6.0を解放する)

ここ
ReorderFactor <- function(dat, column_name){ 
      column_name <- enquo(column_name) 
      nm1 <- quo_name(column_name) 
      dat %>% 
       mutate(UQ(nm1) := factor(UQ(column_name), 
        levels = unique(UQ(column_name))[order(A, decreasing = FALSE)])) 

} 

dfN <- ReorderFactor(df, B) 
identical(df2, dfN) 
#[1] TRUE 

からquosureを使用することができ、enquoは、入力引数を取り、によってmutate/summariseなどの中で評価されquosureに変換し、引用符で囲まれていません(UQ)。 lhsの値を( 'nm1')の文字列を引用符で区切って(:=)割り当てることができます。

注:ここでは、パッケージはまだCRANにないので、あなたがmutate_atを使用して、変数を参照することができます異なるデータセット

+0

として変異したされて、私はこのソリューションをテストすることができませんでした。リリースがクルーになる日はありますか?バージョン0.6.0を使用せずにこれを回避する方法もありますか? –

+0

@TobiasDekkerあなたは 'devtools' https://github.com/tidyverse/dplyrを使ってgithubからインストールできます – akrun

関連する問題