2016-05-31 2 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 '). Тем не менее, вы можете сделать это «aggregate» (Sales ~ Store, data = train [Sales! = 0,], mean) ', чтобы избежать функции' 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

@ Jasper Спасибо. Но я думаю, что эта функция будет лучше, если потребуется набор данных, столбцы для агрегирования, столбец, на который нужно ссылаться t, чтобы группировать и агрегировать функцию. – verystrongjoe

+0

@verystrongjoe Я добавил пример с 'dplyr', может быть, это более интуитивно понятно? Ознакомьтесь с [Введение в dplyr] (https://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html), если вы хотите узнать больше о его синтаксисе. Это очень удобно, когда вы это понимаете. – Jasper

Смежные вопросы