在函数中使用ddply并包含感兴趣的变量作为参数

时间:2013-08-29 16:40:54

标签: r plyr

我对R比较陌生,并尝试使用ddply&从plyr包中总结出来。 This post几乎(但不完全)回答了我的问题。我可以使用一些额外的解释/澄清。

我的问题:

我想创建一个简单的函数来按组分析给定变量的描述性统计。与链接的帖子不同,我想将感兴趣的变量作为函数的参数包含在内。正如本网站已经讨论的那样,这有效:

require(plyr)

ddply(mtcars, ~ cyl, summarise,
  mean = mean(hp),
  sd   = sd(hp),
  min  = min(hp),
  max  = max(hp)
)

但这不是:

descriptives_by_group <- function(dataset, group, x)
{
  ddply(dataset, ~ group, summarise,
    mean = mean(x),
    sd   = sd(x),
    min  = min(x),
    max  = max(x)
  )
}

descriptives_by_group(mtcars, cyl, hp)

由于我正在使用的数据量,我希望能够有一个函数,允许我指定我感兴趣的变量以及数据集和分组变量。

我尝试编辑here找到的各种解决方案来解决我的问题,但我不能很好地理解代码,以便成功完成。

原始海报使用了以下示例数据集:

a = c(1,2,3,4)
b = c(0,0,1,1)
c = c(5,6,7,8)
df = data.frame(a,b,c)
sv = c("b")

使用所需的输出:

  b Ave
1 0 1.5
2 1 3.5

哈德利赞同的解决方案是:

myFunction <- function(x, y){
NewColName <- "a"
z <- ddply(x, y, .fun = function(xx,col){
                         c(Ave = mean(xx[,col],na.rm=TRUE))}, 
           NewColName)
return(z)
}

myFunction(df, sv)返回所需输出的位置。

我试图逐段分解代码,看看是否通过更好地理解底层机制,我可以修改代码以包含一个参数,该函数将传递给什么,在本例中,是“NewColName”(您想要获取有关信息的变量)。但我没有任何成功。我的困难在于我不明白(xx[,col])发生了什么。我知道mean(xx [,col])应该采用数据框col的索引为xx的列的平均值。但我不明白匿名函数从哪里读取这些值。

请有人帮我解析一下吗?我浪费了几个小时完成一项微不足道的任务,我可以通过非常重复的代码和/或子集来轻松完成,但是我试图让我的脚本更简单和优雅,并且理解这个问题的“为什么”,其解决方案。

PS我已经从psych包中查看了describeBy函数,但据我所知,它不允许你指定要为其返回值的变量,因此无法解决我的问题。

4 个答案:

答案 0 :(得分:7)

我刚刚在你给出的示例函数中移动了几个东西,并展示了如何让多个列退出。这样做你想要的吗?

myFunction2 <- function(x, y, col){
z <- ddply(x, y, .fun = function(xx){
                         c(mean = mean(xx[,col],na.rm=TRUE),
                         max = max(xx[,col],na.rm=TRUE) ) })
return(z)
}

myFunction2(mtcars, "cyl", "hp")

答案 1 :(得分:5)

(更多的是评论而不是答案。在函数中使用ddply(...,summarise, ...)时,我遇到了与您相同的难度。)这是一个按我预期的方式工作的基本解决方案:

descriptives_by_group <- function(dataset, group, x)
  {aggregate(dataset[[x]], dataset[group], function(x)
      c(  mean = mean(x),
          sd   = sd(x),
          min  = min(x),
          max  = max(x)
         ) )
  }

descriptives_by_group(mtcars, 'cyl', 'hp')

答案 2 :(得分:3)

只需使用as.quoted功能即可。以下示例

simple_ddply <- function(dataset_name, variable_name){
    data <- ddply(dataset_name,as.quoted(variable_name), *remaining input)**

答案 3 :(得分:0)

quosures的devel版本中引入dplyr(即将发布0.6.0),这会变得更容易

library(dplyr)
descriptives_by_groupN <- function(dataset, group, x) {

   group <- enquo(group)
   x <- enquo(x)

  dataset %>%
         group_by(!!group) %>%
         summarise(Mean = mean(!!x),
                SD = sd(!!x),
                Min = min(!!x),
                Max = max(!!x))
}

descriptives_by_groupN(mtcars, cyl, hp)
# A tibble: 3 × 5
#   cyl      Mean       SD   Min   Max
#  <dbl>     <dbl>    <dbl> <dbl> <dbl>
#1     4  82.63636 20.93453    52   113
#2     6 122.28571 24.26049   105   175
#3     8 209.21429 50.97689   150   335

此处,输入参数将转换为quosures enquo,并在group_by/summarise内,取消引用quosures(!!UQ)以获取它进行了评估