2016-08-25 8 views
0

グループ化によって定義されたデータのパーティションに適用したい関数名の列を含むデータフレームがあります。ここでは、セットアップの簡単な例です:magrittrの文字列名で関数参照を適用する

df <- data.frame(x = c(1,2,3,4)) 
df.with.method <- df %>% merge(y = data.frame(method = c("mean", "median"))) 

ので、好きなものを私は知ってやりたいことは、各パーティションにメソッドを適用する次のとおりです。

df.with.method %>% group_by(method) %>% 
    mutate(x.hat = eval(method)(x)) 

これは戻って、しかし、動作しません。 a Error: attempt to apply non-functionエラー。

df.with.method %>% group_by(method) %>% 
    mutate(x.hat = eval(parse(text = method))(x)) 

しかし、基本的な考え方を提案し、このない仕事は、OKです::これはどちらか動作しません

df.with.method %>% group_by(method) %>% 
    mutate(x.hat = eval(parse(text = "mean"))(x)) 
+1

あなたのメソッドが文字クラスであると仮定して、 'get(unique(method))(x)'は動作します。 – Psidom

+1

... 'data.frame(method = c(" mean "、" median ")、stringsAsFactors = FALSE)'とマージすると仮定します。現在、それは 'factor'なので、' get(unique(method))(x) 'は正しく動作しないかもしれません。 – r2evans

答えて

0

あなたが呼び出しを構築し、それぞれcall()eval()でそれを評価することができます。それはかなりではありませんが、それは動作し、をdf.with.methodに設定してください。

0

以下を試してください。 data.frameではなくdata_frameを使用することに注意してください。

library(dplyr) 

df <- data_frame(x = c(1,2,3,4)) 
df.with.method <- df %>% merge(y = data_frame(method = c("mean", "median"))) 

df.with.method %>% 
    group_by(method) %>% 
    summarize(x = match.fun(method[1])(x)) %>% 
    ungroup() 

summarize部分が交互に次のようになります。

summarize(x = do.call(method[1], list(x))) 

df.with.methodは正確に質問に示されなければならないようならば、すなわちmethodが要因である、そしてsummarize文でas.character(method)methodを交換してください。

関連する問題