7

我对 R 比较陌生,并尝试使用 plyr 包中的 ddply 和汇总。这个帖子几乎但不完全回答了我的问题。我可以使用一些额外的解释/澄清。

我的问题:

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

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)

由于我正在处理的数据量很大,我希望能够有一个函数来指定我感兴趣的变量以及数据集和分组变量。

我试图编辑这里找到的各种解决方案来解决我的问题,但我对代码的理解不够好,无法成功完成。

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

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)
}

WheremyFunction(df, sv)返回所需的输出。

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

有人可以帮我解析一下吗?我已经浪费了几个小时在一个琐碎的任务上,我可以通过非常重复的代码和/或子集轻松完成,但我一直在试图让我的脚本更简单和优雅,以及理解这个问题的“原因”和其解决方案。

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

4

4 回答 4

8

我只是在您提供的示例函数中移动了一些东西,并展示了如何取出多个列。这是做你想做的吗?

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")
于 2013-08-29T17:59:25.573 回答
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')
于 2013-08-29T18:57:11.700 回答
3

只需使用as.quoted功能。下面的例子

simple_ddply <- function(dataset_name, variable_name){
    data <- ddply(dataset_name,as.quoted(variable_name), *remaining input)**
于 2014-06-17T11:58:24.330 回答
0

随着(即将发布)quosures的开发版本中的引入,这变得更加容易dplyr0.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

在这里,输入参数被转换为quosureswith enquo,并在 内部group_by/summarise,取消引用 quosures (!!UQ) 以对其进行评估

于 2017-04-15T04:23:36.847 回答