2016-03-23 11 views
1

私の関数内にdplyr関数を置くことに本当に苦労しています。標準評価版の末尾にfunction_の接尾辞がありますが、まだ問題がありますが、外見上はevalpastelazyのすべての組み合わせを試しました。mutate_each_非標準の評価

グループのコントロールの中央値で複数の列を分割しようとしています。例のデータには、 'Control'という名前のアイリスの列が追加されているため、各種には40個の「正常」と10個の「制御」があります。

data(iris) 
control <- rep(c(rep("normal", 40), rep("control", 10)), 3) 
iris$Control <- control 

ノーマルdplyrが正常に動作します:

機能にこれを包むしようとすると
out_df <- iris %>% 
    group_by(Species) %>% 
    mutate_each(funs(./median(.[Control == "control"])), 1:4) 

norm_iris <- function(df, control_col, control_val, species, num_cols = 1:4){ 

out <- df %>% 
    group_by_(species) %>% 
    mutate_each_(funs(./median(.[control_col == control])), num_cols) 
    return(out) 
} 

norm_iris(iris, control_col = "Control", control_val = "control", species = "Species") 

私はエラーを取得する:

Error in UseMethod("as.lazy_dots") : 
no applicable method for 'as.lazy_dots' applied to an object of class "c('integer', 'numeric')" 

代わりfuns_を使用してfunsお得ですError:...: need numeric data

答えて

1

標準評価hereのビネットをまだ読んでいない場合は、すぐに変更される可能性がありますが、それが聞こえるかもしれません。

あなたの機能は、パッケージmutate_each_ラインでlazyevalからinterpの使用が含まれていません。 funsに変数名(Control変数)を使用しようとしているため、interpと共にfuns_が必要です。これは、mutate_each_がまったく必要ない状況であることに注意してください。変更する列を選択するときに、列番号の代わりに列名を使用しようとしている場合は、これが必要になります。ここで

はラインではなく、あなたが持っているものをあなたの関数でどのように見えるかです:

mutate_each(funs_(interp(~./median(.[x == control_val]), x = as.name(control_col))), 
         num_cols) 
関連する問題