Что означает «интерфейс стандартной формулы к data.frame» в R? - PullRequest
7 голосов
/ 17 сентября 2011

Документация для aggregate гласит:

«aggregate.formula» - это стандартный интерфейс формул для «aggregate.data.frame».

Я новичок в R, и я не понимаю, что это значит. Пожалуйста, объясните!

Спасибо!

Uri

1 Ответ

10 голосов
/ 17 сентября 2011

Перейдите к середине раздела примеров help(aggregate), и вы увидите это:

 ## Formulas, one ~ one, one ~ many, many ~ one, and many ~ many:
 aggregate(weight ~ feed, data = chickwts, mean)
 aggregate(breaks ~ wool + tension, data = warpbreaks, mean)
 aggregate(cbind(Ozone, Temp) ~ Month, data = airquality, mean)
 aggregate(cbind(ncases, ncontrols) ~ alcgp + tobgp, data = esoph, sum)

Четыре различных вызова aggregate(), все с использованием интерфейса формула .То, как написано выше в приведенной вами цитате, связано с механизмом диспетчеризации методов, используемым в R.

Рассмотрим первый пример:

R> class(weight ~ feed)
[1] "formula"
R> class(chickwts)
[1] "data.frame"

, так что агрегат отправляет первый аргумент (класс formula).То, как формула разрешается в R, обычно вращается вокруг model.matrix, я предполагаю, что здесь происходит нечто подобное, и эквивалентный вызов в конечном итоге выполняется aggregate.data.frame, используя второй аргумент chickwts, data.frame.

R> aggregate(weight ~ feed, data = chickwts, mean)
       feed  weight
1    casein 323.583
2 horsebean 160.200
3   linseed 218.750
4  meatmeal 276.909
5   soybean 246.429
6 sunflower 328.917
R> 

То, что вы спросили, не самый простой вопрос для начинающих, я рекомендовал бы внимательно изучить некоторые документы и приличную книгу по R, если у вас есть один удобный.(И другие вопросы SO дают рекомендации относительно того, что читать дальше.)

Редактировать: Мне пришлось немного копать, поскольку aggregate.formula() не экспортируется из пространства имен stats, но выможно посмотреть на него, набрав stats:::aggregate.formula в приглашении - что ясно показывает, что оно действительно отправляет на aggregate.data.frame():

 [.... some code omitted ...]
    if (is.matrix(mf[[1L]])) {
        lhs <- as.data.frame(mf[[1L]])
        names(lhs) <- as.character(m[[2L]][[2L]])[-1L]
        aggregate.data.frame(lhs, mf[-1L], FUN = FUN, ...)
    }
    else aggregate.data.frame(mf[1L], mf[-1L], FUN = FUN, ...)
}
<environment: namespace:stats>
R> 
...