2016-05-31 43 views
0

像下面关于聚合函数的源代码,我不明白为什么我们必须在这里使用list函数()。而不是我想用一个需要分组的列来替换它。我不知道为什么我们使用相同的数据集,例如'train [Sales!= 0]'两次?如果我使用其他数据集作为第二个数据集参数,该怎么办?我认为这会使改变成为相当高的可能性错误。聚合函数不直观

aggregate(train[Sales != 0]$Sales, 
       by = list(train[Sales != 0]$Store), mean) 

也许有人会说这是错误的用例。但我也在R中看到这个源代码

## Compute the averages for the variables in 'state.x77', grouped 
## according to the region (Northeast, South, North Central, West) that 
## each state belongs to. 
aggregate(state.x77, list(Region = state.region), mean) 

感谢您阅读我的问题。

+2

我认为你的代码可能是错误的。如果'train'是一个矩阵或data.frame这个命令'train [Sales!= 0]'给你一个错误('undefined columns selected')。尽管如此,你可以这样做,以避免使用list()函数。 'state.x77'是一个已经附加的数据集,因此你可以像这个例子一样使用它。 – Jimbou

回答

1

首先,如果你不喜欢聚合函数的语法,你可以看看dplyr包。它的语法对你来说可能更容易一些。

回答您的问题:

  1. 第二个参数是刚刚有望成为一个列表,这样你就可以添加多个变量。
  2. 您必须使用train[Sales != 0]两次,因为否则第一个和by参数会查看不同的索引。你也可以做一个子集,第一:

基地R-代码:

trainSales <- train[Sales != 0] 
aggregate(trainSales$Sales, by = list(trainSales$Store), mean) 

随着dplyr你可以做这样的事情:

train %>% 
    filter(Sales != 0) %>% 
    group_by(Store) %>% 
    summarise_each(funs(mean)) 

你看我用summarise_each,因为它凝结数据集为一行,但您也可以做一些操作,使所有行保持不变(在这种情况下,请使用do)。

+0

'aggregate'具有更好的公式方法,语法更方便。 – Roland

+0

@贾斯珀谢谢。但是我认为这个函数会更好,如果它需要数据集,要聚合的列,要引用的列以及聚合函数。 – verystrongjoe

+0

@verystrongjoe我也用'dplyr'添加了一个例子,也许这更直观?如果你想了解更多关于它的语法的信息,请查看[dplyr简介](https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html)。当你掌握它的时候它真的很方便。 – Jasper