【问题标题】:Cycling through a vector [closed]循环通过向量[关闭]
【发布时间】:2023-03-30 20:50:01
【问题描述】:

我想知道是否可以在 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)

这在 R 中可能吗?

【问题讨论】:

  • 您在这里混淆了列表和向量。但是是的,这是可能的——你最好的起点可能是遵循一个非常基本的 R 教程......这可能有助于清除列表/向量的混淆:stackoverflow.com/questions/8594814/…
  • 感谢您的澄清。我现在要读这个。顺便说一句,如果存在,我该怎么做?
  • 看到这样的东西:vec <- c(5:10); for(i in seq_along(vec)) { print(c(vec[-(0:i)], vec[0:i])) }.
  • @alexis_laz 将其发布为 OP 可以投票并接受它的答案。这就是他要找的东西。
  • 正如其他人在 Answers 中指出的那样,这可以通过一些简单的索引或数学来完成,但是我的 permute 包(在 CRAN 上)中有这样一个函数,它可以执行这些循环移位排列,并且将为您生成所有此类排列。

标签: r vector


【解决方案1】:

我不知道你想做什么,但在下面的例子中,你可以“看到”(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]))

【讨论】:

  • 感谢@Jilber 完成它;)
【解决方案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

【讨论】:

  • 另一种有趣的方法是n &lt;- length(x); suppressWarnings(matrix(x, n+1, n)[-n-1,])
  • @flodel 谢谢,这确实是....有趣:-)
猜你喜欢
  • 2015-08-12
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-30
  • 1970-01-01
相关资源
最近更新 更多