Оптимизация скорости l oop в формате xts в R - PullRequest
0 голосов
/ 18 июня 2020

У меня есть данные, структурированные как xts, как показано ниже: enter image description here

Размер составляет 2298 строк и 30 столбцов. Я хочу сделать al oop в каждой строке и столбце и сохранить его в новой матрице / фрейме данных. Рассматривая данные xts как переменную a, пример кода будет:

for(i in 1:nrow(a)){
 b[i,1] <- a[i,1]
  for(j in 2:ncol(a)){
   b[i,j] <- ((1+a[i,j])^j/(1+b[i,j-1]))-1
  }
}

Поскольку циклы for в R действительно медленные, мне интересно, как мне ускорить эту функцию.

1 Ответ

1 голос
/ 19 июня 2020

Я думаю, что медлительность связана с тем, что вы не выделили память для b перед запуском l oop, а также R использует векторизованные операции и, следовательно, i l oop не требуется:

system.time({
  b <- matrix(0, nrow(a), ncol(a))
  b[,1] <- a[,1]
  for(j in 2:ncol(a)){
    b[,j] <- ((1+a[,j])^j/(1+b[,j-1]))-1
  }
})
#   user  system elapsed 
#      0       0       0 

данные:

#R-3.6.1 64bit Win10
set.seed(0L)
nr <- 2298L
nc <- 30L
library(xts)
a <- xts(matrix(rnorm(nr*nc), nr, nc), seq(Sys.Date()-nr, by="1 day", length.out=nr))
...