Р: Роллинг ранга многомерного временного ряда? - PullRequest
4 голосов
/ 09 ноября 2010

Я хочу ранжировать набор переменных каждый день (начиная с серии zoo).

Вот пример:

set.seed(1)
x <- zoo(matrix(rnorm(9), nrow=3), as.Date("2010-01-01") + 0:2)
colnames(x) <- letters[1:3]

Единственный способ, которым я знаю, это сделать с rollapply, но это довольно медленно.

>  rollapply(x, 1, rank, by.column=FALSE)
           a b c
2010-01-01 1 3 2
2010-01-02 1 2 3
2010-01-03 1 2 3

Любые другие предложения?

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Я думаю, вы идете по этому пути правильно.Использование order вместо rank немного быстрее, но я не вижу, как это "довольно медленно".Может быть, вы могли бы немного рассказать о вашей актуальной проблеме?

> system.time(for(i in 1:1000) rollapply(z, 1, order, by.column=FALSE))
   user  system elapsed 
      1       0       1 
> system.time(for(i in 1:1000) rollapply(z, 1, rank, by.column=FALSE))
   user  system elapsed 
   1.34    0.00    1.34 
2 голосов
/ 09 ноября 2010

Прежде всего, спасибо за отправку полного и воспроизводимого примера.

Во-вторых, мне нравится ваше решение. Вам может быть трудно сделать это намного быстрее, но при этом держать его простым. Одним из решений является JST работать с базовой матрицей (а не с объектом зоопарка):

> X <- coredata(x)
> t(apply(X, 1, rank))
     a b c
[1,] 1 3 2
[2,] 1 2 3
[3,] 1 2 3
> 

и затем повторно прикрепить индекс времени. Это может быть быстрее, но не обязательно более оборонительным или более легко читаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...