将参数传递给使用plyr的R函数

4

我无法解决一个问题。希望编写一个类似下面的函数:

   f.describe <- function(.data, .var, .by)
   {
        require(plyr)

        res <- ddply(.data, .by, 
    summarize, 
    N = sum(!is.na(.var))
    `Mean (SD)`=sprintf("%5.2f (%5.2f)", 
                       mean(.var, na.rm=TRUE), sd=sd(.var, na.rm=TRUE)),
     Median = sprintf("%5.2f", median(.var))    
        )
    res
   }

但是我找不到传递变量进行处理的方法(.var),出现了这个错误:

错误 eval(expr, envir, enclos) : 找不到对象“ .var”从其他语言翻译而来,因此可能不完全准确适用于英语用户

我尝试使用eval、substitute但都没有解决办法...非常感谢您的帮助。有时我不理解R用于评估的规则。


plyr在函数内部变量作用域方面存在已知问题。 - baptiste
你是指“点”函数吧。我知道,但是我还是找不到解决办法... - crow16384
不幸的是,我找不到我遇到类似问题时所进行的讨论。我的丑陋解决方法是使用<<-将一个局部变量推入全局环境中,以便plyr可以找到它... - baptiste
@baptiste:感谢您的建议。我不想使用全局变量。可能可以通过解析找到丑陋的解决方案,但我相信有一些符合语言规则的优美解决方案 :) - crow16384
2
相关问题和讨论(包括@hadley的评论,建议Jan van der Laan的解决方案是首选的解决方法) - baptiste
1个回答

5

如果你要使用 ddply,那么传递一个函数可能比使用 summarize 更容易:

f.describe <- function(.data, .var, .by) {
    require(plyr)

    ddply(.data, .by, function(d) {
       c(N = sum(!is.na(d[[.var]])),
       `Mean (SD)`=sprintf("%5.2f (%5.2f)", 
           mean(d[[.var]], na.rm=TRUE), 
           sd=sd(d[[.var]], na.rm=TRUE)),
       Median = sprintf("%5.2f", median(d[[.var]])))    
    })
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接