【问题标题】:passing parameters to R function used plyr将参数传递给使用 plyr 的 R 函数
【发布时间】:2013-04-25 12:45:04
【问题描述】:

我无法解决一个问题。想写一个这样的函数:

   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) 的方法。有这个错误:

Error eval(expr, envir, enclos) : object '.var' was not found翻译自其他语言,因此对于英语用户来说可能不是逐字记录 )

我尝试了评估,替代但没有解决方案...非常感谢您的帮助。有时我不明白 R 用于评估的规则。

【问题讨论】:

  • plyr 确实存在函数内部变量范围的已知问题。
  • 你的意思是。 (点)函数。我知道,但是四处走走我仍然没有解决办法......
  • 不幸的是,当我遇到类似问题时,我找不到我所进行的讨论。我丑陋的解决方法是使用 &lt;&lt;- 将局部变量推送到 plyr 可以找到它的全局环境中......
  • @baptiste:感谢您的建议。我不想使用全局变量。可以通过解析找到丑陋的解决方案,但我相信有一些漂亮的语言规则:)
  • related question and discussion (包括来自@hadley 的评论,暗示以下 Jan van der Laan 的解决方案是首选解决方法)

标签: r


【解决方案1】:

在这种情况下,将函数传递给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]])))    
    })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-12
    • 2012-06-07
    • 2018-08-05
    • 2019-03-29
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    相关资源
    最近更新 更多