骑自行车通过矢量

时间:2013-10-25 18:17:20

标签: r vector

我想知道R是否有可能这样做:

  1. 我有list <- c(x1, x2, x3, x4, xn...)
  2. 使用for循环,将x1放在列表底部,显示c(x2, x3, x4, xn.. x1)
  3. 下一个循环将是c(x3, x4, x5... x1, x2)
  4. 这可能在R?

2 个答案:

答案 0 :(得分:3)

我不知道你要做什么,但在下面的例子中,你可以“看到”(print)循环在每次运行中的作用:

#a vector (and not list)
vec <- c(5:10) 

#the loop
for(i in seq_along(vec)) { print(c(vec[-(0:i)], vec[0:i])) }

#[1]  6  7  8  9 10  5
#[1]  7  8  9 10  5  6
#[1]  8  9 10  5  6  7
#[1]  9 10  5  6  7  8
#[1] 10  5  6  7  8  9
#[1]  5  6  7  8  9 10  

如果您想存储输出而不仅仅是为了查看它,请考虑以下事项:

> result <- vector("list", length(vec))
> for(i in seq_along(vec)) { 
    result[[i]] <- c(vec[-(0:i)], vec[0:i])
  }
> 
> do.call(rbind, result)
     [,1] [,2] [,3] [,4] [,5] [,6]
[1,]    6    7    8    9   10    5
[2,]    7    8    9   10    5    6
[3,]    8    9   10    5    6    7
[4,]    9   10    5    6    7    8
[5,]   10    5    6    7    8    9
[6,]    5    6    7    8    9   10

为了避免在列表中进行预分配以及最后for循环和rbindsapply是不错的选择

sapply(1:length(vec), function(i) c(vec[-(0:i)], vec[0:i]))

答案 1 :(得分:2)

同上。不知道你想要做什么,但这里有一个返回矩阵的替代方案......

sapply( 0:9 , function(x) c( (1 + x) : 10 , seq_len(x)  ) )
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    2    3    4    5    6    7    8    9    10
# [2,]    2    3    4    5    6    7    8    9   10     1
# [3,]    3    4    5    6    7    8    9   10    1     2
# [4,]    4    5    6    7    8    9   10    1    2     3
# [5,]    5    6    7    8    9   10    1    2    3     4
# [6,]    6    7    8    9   10    1    2    3    4     5
# [7,]    7    8    9   10    1    2    3    4    5     6
# [8,]    8    9   10    1    2    3    4    5    6     7
# [9,]    9   10    1    2    3    4    5    6    7     8
#[10,]   10    1    2    3    4    5    6    7    8     9