Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 将循环中的第一个元素与最后一个元素切换_R_Algorithm_Switch Statement_Permute - Fatal编程技术网

R 将循环中的第一个元素与最后一个元素切换

R 将循环中的第一个元素与最后一个元素切换,r,algorithm,switch-statement,permute,R,Algorithm,Switch Statement,Permute,在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位。恐怕你必须想出一个自制的功能,类似这样的功能: rot

在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位。

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

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

rotate恐怕您必须想出一个自制的函数,类似这样的函数:

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

旋转如果需要矩阵输出

 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如果需要矩阵输出

 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您还可以使用
tail
head
功能:

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

并修改
n
以旋转
n

您还可以使用
尾部
头部
功能:

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

并修改
n
以旋转
n

排列程序包可以为您执行以下操作:

ap <- allPerms(length(months),
               control = how(within = Within(type = "series"),
                             observed = TRUE))
ap[rev(seq_len(nrow(ap))), ]
从技术上讲,这只起作用,因为
months
是向量
1:12
allPerms()
返回要排列的对象的索引的排列矩阵。对于不同的输入,使用
ap
索引要排列的内容

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

perms该permute软件包可以为您完成以下任务:

ap <- allPerms(length(months),
               control = how(within = Within(type = "series"),
                             observed = TRUE))
ap[rev(seq_len(nrow(ap))), ]
从技术上讲,这只起作用,因为
months
是向量
1:12
allPerms()
返回要排列的对象的索引的排列矩阵。对于不同的输入,使用
ap
索引要排列的内容

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

perms需要的最终输出是什么?与原始输入相同?您的代码中应该有
1:12
seq(1,12)
,或者
seq(12)
,但从技术上讲,不是
seq(1:12)
@MaratTalipov,
seq(1:12)
,因为
seq(1:12)
的工作方式不标准,如果是过杀和冗余的话
seq(1:12)
等同于
seq(以及=1:12)
。最终需要的输出是什么?与原始输入相同?您的代码中应该有
1:12
seq(1,12)
,或者
seq(12)
,但从技术上讲,不是
seq(1:12)
@MaratTalipov,
seq(1:12)
,因为
seq(1:12)
的工作方式不标准,如果是过杀和冗余的话
seq(1:12)
等同于
seq(以及=1:12)
。另一种获取矩阵的方法:
z No,因为它生成对称矩阵,其中第一行包含原始向量,并且每一后续行将前一行向左旋转一个位置。哦,我刚刚注意到,您的解决方案不仅旋转而且反转原始向量(例如,查看示例输出的最后一行)。@MaratTalipov我查看的是列而不是行。获取矩阵的另一种方法:
z否,因为它生成对称矩阵,其中第一行包含原始向量,随后的每一行都会将前一行向左旋转一个位置。哦,我刚刚注意到,您的解决方案不仅会旋转,而且会反转原始向量(例如,查看示例输出的最后一行)。@MaratTalipov我正在查看列而不是行。