Извлечение оконной функции в R для пользователя Matlab - PullRequest
1 голос
/ 09 марта 2011

Я начал программировать на R (из Matlab), и мне просто стало интересно, есть ли встроенная функция R, похожая на buffer.m в Matlab, см .: http://www.mathworks.com/help/toolbox/signal/buffer.html

Iв настоящее время он реализован самостоятельно, но встроенная функция может быть полезной / более быстрой.

Ответы [ 2 ]

4 голосов
/ 09 марта 2011

Команда Matlab buffer может быть выражена с помощью rollapply из зоопарка. Следующий вкладыш дает тот же результат, что и buffer(x, n, p), и, кажется, работает для неотрицательного p:

> library(zoo)
> x <- 1:30
> n <- 7
> p <- 3
> unname(t(rollapply(zoo(c(rep(0, p), x, rep(0, n-p))),  n, by = n-p, c)))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    2    6   10   14   18   22   26
[2,]    0    3    7   11   15   19   23   27
[3,]    0    4    8   12   16   20   24   28
[4,]    1    5    9   13   17   21   25   29
[5,]    2    6   10   14   18   22   26   30
[6,]    3    7   11   15   19   23   27    0
[7,]    4    8   12   16   20   24   28    0

В версии для разработчиков в зоопарке это можно немного сократить до:

t(rollapply(c(rep(0, p), x, rep(0, n-p)),  n, by = n-p, c))

EDIT:

Обратите внимание, что когда на вопрос был впервые дан ответ, то была версия разработки zoo, ставшая производственной версией zoo на CRAN, поэтому теперь работает более короткая вторая версия кода.

2 голосов
/ 09 марта 2011

Здесь может помочь функция embed.Вот, например, buffer(x,n,p) для p > 0.Я оставлю другие варианты в качестве упражнения.

buffer <- function(x,n,p) {
  L <- length(x)
  nC <- ceiling( L /(n-p) )  
  xPad <- c(rep(0,p), x, rep(0, nC * (n - p) - L))
  t(embed( xPad, dim=n)[seq(1, length(xPad) - n + 1, by=n-p), n:1])
}



> buffer(1:30,7,3)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    2    6   10   14   18   22   26
[2,]    0    3    7   11   15   19   23   27
[3,]    0    4    8   12   16   20   24   28
[4,]    1    5    9   13   17   21   25   29
[5,]    2    6   10   14   18   22   26   30
[6,]    3    7   11   15   19   23   27    0
[7,]    4    8   12   16   20   24   28    0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...