【问题标题】:Switching the first element with the last one in a loop在循环中将第一个元素与最后一个元素切换
【发布时间】:2015-04-18 08:00:21
【问题描述】:

R中是否有一个函数可以将向量中的第一个元素与最后一个元素进行切换?我有一个需要重新排序的 for 循环。来自:

months = seq(1:12)
[1]  1  2  3  4  5  6  7  8  9 10 11 12

我想要:

[1]  12 1  2  3  4  5  6  7  8  9 10 11

然后又一次:

[1]  11 12  1  2  3  4  5  6  7  8  9 10

... 直到第 12 位。

【问题讨论】:

  • 最终期望的输出是什么?和原来的输入一样吗?
  • 您的代码中应该有1:12seq(1,12)seq(12),但不能有seq(1:12)
  • @MaratTalipov 从技术上讲,seq(1:12) 很好,如果过度杀伤和冗余,因为seq 工作的非标准方式。 seq(1:12) 等同于 seq(along.with = 1:12)

标签: r algorithm switch-statement permute


【解决方案1】:

如果需要矩阵输出

 cbind(c(months),embed(c(months, months), 12)[-13,-12])
 #       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
 # [1,]    1   12   11   10    9    8    7    6    5     4     3     2
 # [2,]    2    1   12   11   10    9    8    7    6     5     4     3
 # [3,]    3    2    1   12   11   10    9    8    7     6     5     4
 # [4,]    4    3    2    1   12   11   10    9    8     7     6     5
 # [5,]    5    4    3    2    1   12   11   10    9     8     7     6
 # [6,]    6    5    4    3    2    1   12   11   10     9     8     7
 # [7,]    7    6    5    4    3    2    1   12   11    10     9     8
 # [8,]    8    7    6    5    4    3    2    1   12    11    10     9
 # [9,]    9    8    7    6    5    4    3    2    1    12    11    10
 #[10,]   10    9    8    7    6    5    4    3    2     1    12    11
 #[11,]   11   10    9    8    7    6    5    4    3     2     1    12
 #[12,]   12   11   10    9    8    7    6    5    4     3     2     1

或@Marat Talipov 建议的另一个方法

 z <- length(months)
 i <- rep(seq(z),z) + rep(seq(z),each=z) - 1
 matrix(months[ifelse(i>z,i-z,i)],ncol=z)

【讨论】:

  • 另一种获取矩阵的方法:z &lt;- length(months); i &lt;- rep(seq(z),z) + rep(seq(z),each=z) - 1; matrix(months[ifelse(i&gt;z,i-z,i)],ncol=z)
  • 不,因为它产生对称矩阵,其中第一行包含原始向量,并且随后的每一行都将前一行向左旋转一个位置。
  • 哦,我刚刚注意到您的解决方案不仅会旋转,还会反转原始向量(例如,查看示例输出的最后一行)。
  • @MaratTalipov 我正在查看列而不是行。
【解决方案2】:

恐怕你必须想出一个自制的功能,像这样的:

rotate <- function(v,i=1) {
  i <- i %% length(v)
  if (i==0) return(v)
  v[c(seq(i+1,length(v)),seq(i))]
}

几个例子:

v <- seq(12)
rotate(v,1)
# [1]  2  3  4  5  6  7  8  9 10 11 12  1

rotate(v,-1)
# [1] 12  1  2  3  4  5  6  7  8  9 10 11

【讨论】:

    【解决方案3】:

    您还可以使用tailhead 函数:

    x = c(tail(x,n), head(x,-n))
    

    并修改n 旋转n

    【讨论】:

      【解决方案4】:

      permute 包可以为您做到这一点:

      ap <- allPerms(length(months),
                     control = how(within = Within(type = "series"),
                                   observed = TRUE))
      ap[rev(seq_len(nrow(ap))), ]
      

      (由于allPerms() 的工作方式,我们需要颠倒行的顺序,这就是最后一行所做的。)

      这给出了:

      > ap[rev(seq_len(nrow(ap))), ]
            [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
       [1,]    1    2    3    4    5    6    7    8    9    10    11    12
       [2,]   12    1    2    3    4    5    6    7    8     9    10    11
       [3,]   11   12    1    2    3    4    5    6    7     8     9    10
       [4,]   10   11   12    1    2    3    4    5    6     7     8     9
       [5,]    9   10   11   12    1    2    3    4    5     6     7     8
       [6,]    8    9   10   11   12    1    2    3    4     5     6     7
       [7,]    7    8    9   10   11   12    1    2    3     4     5     6
       [8,]    6    7    8    9   10   11   12    1    2     3     4     5
       [9,]    5    6    7    8    9   10   11   12    1     2     3     4
      [10,]    4    5    6    7    8    9   10   11   12     1     2     3
      [11,]    3    4    5    6    7    8    9   10   11    12     1     2
      [12,]    2    3    4    5    6    7    8    9   10    11    12     1
      

      从技术上讲,这只有效,因为months 是向量1:12,而allPerms() 返回您想要置换的事物的索引的置换矩阵。对于不同的输入,使用ap 来索引你想要置换的东西

      perms <- ap
      perms[] <- months[ap[rev(seq_len(nrow(ap))), ]]
      perms
      

      【讨论】:

        猜你喜欢
        • 2016-02-22
        • 2014-05-21
        • 1970-01-01
        • 2013-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多