相当于R中的numpy.roll()?

sud*_*all 15 python numpy r

我有一个数组:

a <- c(1,2,3,4,5)
Run Code Online (Sandbox Code Playgroud)

我想做的事情如下:

b <- roll(a,2) # 4,5,1,2,3
Run Code Online (Sandbox Code Playgroud)

在R中有这样的功能吗?我一直在谷歌搜索,但"R Roll"主要给我关于西班牙语发音的页面.

Sim*_*lon 19

如何使用headtail......

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
Run Code Online (Sandbox Code Playgroud)

关于使用headtail...的一个很酷的事情,你得到一个负面的反向滚动n,例如

roll(1:5,-2)
[1] 3 4 5 1 2
Run Code Online (Sandbox Code Playgroud)


Jos*_*ien 17

这是一种替代方案,即使在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
Run Code Online (Sandbox Code Playgroud)

FWIW(而不是它值得)它也适用于data.frames:

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
Run Code Online (Sandbox Code Playgroud)


Adr*_*ins 5

该软件包binhf具有以下功能shift

library(binhf)

shift(1:5, places = 2)
#[1] 4 5 1 2 3
Run Code Online (Sandbox Code Playgroud)

地方可以是积极的也可以是消极的