在magrittr中应用字符串名称的函数引用

时间:2016-08-25 00:32:14

标签: r 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))

2 个答案:

答案 0 :(得分:0)

您可以构建调用并分别使用call()eval()对其进行评估。它不漂亮但有效,请务必为stringsAsFactors = FALSE设置df.with.method

df.with.method %>% group_by(method) %>%
    mutate(x.hat = mapply(function(a, b) eval(call(a, b)), method, x))

答案 1 :(得分:0)

尝试以下方法。请注意,我们使用README.rdoc而不是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语句中将method替换为as.character(method)。< / p>