Функция 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()
?