Функция
R ave()
гораздо более полезна, чем предполагает ее название - в основном это версия 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()
?