2016-05-31 78 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