2016-08-25 71 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)) 

这不起作用,但是,回国一个Error: attempt to apply non-function错误。这不起作用或者:

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

然而,这并不工作,这表明其基本思想是确定:

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)合并。目前它是一个“因素”,所以'get(unique(method))(x)'可能无法正常工作。 – r2evans

回答

0

您可以构建呼叫,并分别call()eval()评估。这不是很好,但它的工作原理,并确保为df.with.method

df.with.method %>% group_by(method) %>% 
    mutate(x.hat = mapply(function(a, b) eval(call(a, b)), method, x)) 
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是一个因素,然后用as.character(method)summarize语句来替换method

相关问题