У меня есть массив:
a <- c(1,2,3,4,5)
И я хотел бы сделать что-нибудь вроде:
b <- roll(a,2) # 4,5,1,2,3
Есть ли такая функция в R? Я гулял по всему миру, но "R Roll" в основном дает мне страницы об испанском произношении.
У меня есть массив:
a <- c(1,2,3,4,5)
И я хотел бы сделать что-нибудь вроде:
b <- roll(a,2) # 4,5,1,2,3
Есть ли такая функция в R? Я гулял по всему миру, но "R Roll" в основном дает мне страницы об испанском произношении.
Как насчет использования 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
Здесь альтернатива, которая имеет преимущество в работе, даже когда 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
Пакет binhf имеет сдвиг функции:
library(binhf)
shift(1:5, places = 2, dir = "right")
#[1] 4 5 1 2 3
Вы также можете использовать пакет permute
:
require(permute)
a <- c(1,2,3,4,5)
shuffleSeries(a, start = 2)
выход:
[1] 3 4 5 1 2