【发布时间】:2014-01-31 00:05:17
【问题描述】:
我希望在函数中使用 ddply 根据用户确定的汇总统计数据(例如平均值、中位数、最小值、最大值)来汇总组,方法是将汇总函数的名称作为变量应用到函数中称呼。但是,我不确定如何将其传递给 ddply。
简单例如
library(plyr)
test.df<-data.frame(group=c("a","a","b","b"),value=c(1,5,5,15))
ddply(test.df,.(group),summarise, mean=mean(value, na.rm=TRUE))
我怎么能像下面这样设置它,将相关函数传递给 ddply (当然,在一个函数中,尽管一旦第一个问题解决了,这应该很简单)。请注意,每个汇总度量(平均值等)都需要 na.rm=TRUE。我可以通过为每个汇总统计量编写自己的替换函数来做到这一点,但这似乎过于复杂。
期望:
#fn<-"mean"
#ddply(test.df,.(group),summarise, fn=fn(value, na.rm=TRUE))
感谢人们提供的任何帮助。
编辑! 感谢所有这些回复。我最初认为省略引号是有效的,但是这种方法,一旦 fn 作为函数调用的一部分,使用 getFunction 或 match.fun 也不起作用。我实际上希望开始工作的是下面的代码行(返回错误)。很抱歉没有在第一个实例中提供更详尽的示例......
test.df<-data.frame(group=c("a","a","b","b"),value=c(1,5,5,15))
my.fun <- function(df, fn="mean") {
summary <- ddply(df,.(group),summarise, summary=match.fun(fn)(value, na.rm=T))
return(summary)
}
my.fun(test.df, fn="mean")
【问题讨论】:
-
我认为如果您从函数名称中删除引号,它将起作用
fn<-mean。 -
快速跟进。我最终通过避免使用 ddply 而使用聚合来规避这个问题。有了这个改变,正确的函数就会被调用,无论是在我的函数调用中引用还是不引用,以及使用或不使用 getFunction 或 match.fun。我仍然有兴趣知道如何使用 ddply 进行这项工作,但现在我认为它突出了能够利用基本函数以及一些出色的贡献包(如 plyr)的实用性。