Аналог 'ave' в plyr?

Функция ave() в R гораздо полезнее, чем можно предположить из ее названия - по сути, это версия tapply(), которая позволяет возвращать вектор той же длины, что и входные данные, и расставлять эти значения в том же порядке, что и входные данные.

> x <- 1:10
> ave(x, x %% 2, FUN=function(d) d-mean(d))
 [1] -4 -4 -2 -2  0  0  2  2  4  4

Аналогичного эффекта можно добиться с помощью ddply(), но для этого требуется пара дополнительных копий данных, а также пара вспомогательных переменных:

> x <- 1:10
> val <- ddply(data.frame(x=x, id=1:10), .(x %% 2), 
     function(d) {d$y <- d$x-mean(d$x); d})
> val[order(val$id),]$y
 [1] -4 -4 -2 -2  0  0  2  2  4  4

Есть ли еще какая-нибудь техника plyr, которая соответствует облегченному подходу, который я могу получить с помощью ave()?

5
задан Matt Dowle 28 March 2013 в 00:46
поделиться