Эквивалентно numpy.roll() в R?

У меня есть массив:

a <- c(1,2,3,4,5)

И я хотел бы сделать что-нибудь вроде:

b <- roll(a,2) # 4,5,1,2,3

Есть ли такая функция в R? Я гулял по всему миру, но "R Roll" в основном дает мне страницы об испанском произношении.

Ответ 1

Как насчет использования head и tail...

roll <- function( x , n ){
  if( n == 0 )
    return( x )
  c( tail(x,n) , head(x,-n) )
}

roll(1:5,2)
#[1] 4 5 1 2 3

#  For the situation where you supply 0 [ this would be kinda silly! :) ]
roll(1:5,0)
#[1] 1 2 3 4 5

Одна хорошая вещь об использовании head и tail... вы получаете обратный рулон с отрицательным n, например.

roll(1:5,-2)
[1] 3 4 5 1 2

Ответ 2

Здесь альтернатива, которая имеет преимущество в работе, даже когда x "прокатывается" более чем на один полный цикл (т.е. когда abs(n) > length(x)):

roll <- function(x, n) {
    x[(seq_along(x) - (n+1)) %% length(x) + 1]
}

roll(1:5, 2)
# [1] 4 5 1 2 3
roll(1:5, 0)
# [1] 1 2 3 4 5
roll(1:5, 11)
# [1] 5 1 2 3 4

FWIW (а не то, что он стоит много), он также работает на data.frame s:

head(mtcars, 1)
#           mpg cyl disp  hp drat   wt  qsec vs am gear carb
# Mazda RX4  21   6  160 110  3.9 2.62 16.46  0  1    4    4
head(roll(mtcars, 2), 1)
#           gear carb mpg cyl disp  hp drat   wt  qsec vs am
# Mazda RX4    4    4  21   6  160 110  3.9 2.62 16.46  0  1

Ответ 3

Пакет binhf имеет сдвиг функции:

library(binhf)

shift(1:5, places = 2, dir = "right")
#[1] 4 5 1 2 3

Ответ 4

Вы также можете использовать пакет permute:

require(permute)

a <- c(1,2,3,4,5)

shuffleSeries(a, start = 2)

выход:

[1] 3 4 5 1 2