我有一个数据框,其中包含一个列,其中包含我想要应用于分组定义的数据分区的函数名称。这是一个简单的设置示例:
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))
答案 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>