ベクトル要素の左右ローテート(シフト) Last modified: Dec 13, 2004
具体例:
ベクトル x = (1, 2, 3, 4, 5, 6, 7, 8, 9, 10) について,
右ローテートを (10, 1, 2, 3, 4, 5, 6, 7, 8, 9)
左ローテートを (2, 3, 4, 5, 6, 7, 8, 9, 10, 1)
とする。それぞれ n 回繰り返した結果は,右(左) n ローテートと呼ぶことにする。
プログラム例:
ローテートする個数が決まっているなら,関数にしなくても良いかもしれない。
rotate.right <- function(x, n=1)
{
last <- length(x)
for (i in 1:n) {
x <- c(x[last], x[-last]) # 最後の要素を取り除いたベクトル(x[-last])の前に,最後の要素(x[last])を置く
}
x
}
rotate.left <- function(x, n=1)
{
for (i in 1:n) {
x <- c(x[-1], x[1]) # 最初の要素を取り除いたベクトル(x[-1])の後に,最初の要素(x[1])を置く
}
x
}
for を使わない場合には,ローテートする個数のチェックなどが必要
要素を並べ替えるか,添え字を並べ替えるか二通りのやり方がある
rotate.right <- function(x, n=1)
{
last <- length(x)
n <- n %% last
if (n) {
c(x[(last-n+1):last], x[-((last-n+1):last)])
# または
# x[c((last-n+1):last, 1:(last-n))]
}
else {
x
}
}
rotate.left <- function(x, n=1)
{
last <- length(x)
n <- n %% last
if (n) {
c(x[-(1:n)], x[1:n])
# または
# x[c((n+1):last, 1:n)]
}
else {
x
}
}
実行結果:
> x <- 1:20
> rotate.right(x) # 右(1)ローテート
[1] 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
> rotate.left(x) # 左(1)ローテート
[1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1
> rotate.left(x, 5) # 左 5 ローテート
[1] 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5
> rotate.right(x, 7) # 右 7 ローテート
[1] 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13
直前のページへ戻る
E-mail to Shigenobu AOKI