Аналог аве в плир? - PullRequest
       20

Аналог аве в плир?

5 голосов
/ 27 декабря 2011
Функция

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()?

Ответы [ 2 ]

8 голосов
/ 27 декабря 2011

Вы можете несколько сократить код ddply, используя transform:

ddply(data.frame(x=x, id=1:10), .(x %% 2),transform,y = x - mean(x))

, но я не думаю, что ddply и другие plyr функции действительно предназначены для воспроизведения функциональности ave, которую вы описываете. Для расщепления и рекомбинации отдельных атомных векторов tapplyave), вероятно, являются подходящими инструментами для работы.

5 голосов
/ 27 декабря 2011

Я недавно написал в блоге , сравнивающем ave, ddply и data.table с точки зрения скорости. Я бы порекомендовал вам взглянуть на data.table, это может оказаться полезным. Извините заранее, если кто-то обиделся на саморекламу.

...