1

我想知道是否可以在 R 中做到这一点:

  1. 我有一个list <- c(x1, x2, x3, x4, xn...)
  2. 使用 for 循环,x1c(x2, x3, x4, xn.. x1).
  3. 下一个循环将是c(x3, x4, x5... x1, x2)

这在R中可能吗?

4

2 回答 2

4

我不知道你想做什么,但在下面的例子中,你可以“看到”(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循环和rbinding,sapply是不错的选择

sapply(1:length(vec), function(i) c(vec[-(0:i)], vec[0:i]))
于 2013-10-25T18:45:28.943 回答
3

同上。不确定您要做什么,但这是返回矩阵的替代方法...

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
于 2013-10-25T18:51:49.470 回答