ベクトル要素の左右ローテート(シフト)     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

Made with Macintosh