R 沿序列移动值

R 沿序列移动值,r,sequence,R,Sequence,我的目标是制作一个类似这样的序列: > c(1, rep(9, 7)) [1] 1 9 9 9 9 9 9 9 > c(9, 1, rep(9, 6)) [1] 9 1 9 9 9 9 9 9 > c(rep(9, 2), 1, rep(9, 5)) [1] 9 9 1 9 9 9 9 9 本质上,我有一个保持不变的序列,但我想一次移动一个值,一个空间 很明显,我可以用一种类似于我所做的方式来写出来,但我真正的顺序要大得多,所以这并不实用。我对这方面的研究有点徒劳无功,因此任

我的目标是制作一个类似这样的序列:

> c(1, rep(9, 7))
[1] 1 9 9 9 9 9 9 9
> c(9, 1, rep(9, 6))
[1] 9 1 9 9 9 9 9 9
> c(rep(9, 2), 1, rep(9, 5))
[1] 9 9 1 9 9 9 9 9
本质上,我有一个保持不变的序列,但我想一次移动一个值,一个空间


很明显,我可以用一种类似于我所做的方式来写出来,但我真正的顺序要大得多,所以这并不实用。我对这方面的研究有点徒劳无功,因此任何建议都将不胜感激。谢谢

您可以使用
stats::filter

x <- c(1, rep(9, 7))

for (i in 1:8) print(x <- c(filter(x, c(0, 1), circular = TRUE, sides = 1)))
#[1] 9 1 9 9 9 9 9 9
#[1] 9 9 1 9 9 9 9 9
#[1] 9 9 9 1 9 9 9 9
#[1] 9 9 9 9 1 9 9 9
#[1] 9 9 9 9 9 1 9 9
#[1] 9 9 9 9 9 9 1 9
#[1] 9 9 9 9 9 9 9 1
#[1] 1 9 9 9 9 9 9 9

x一个选项是
embed

 embed(c(rev(v1),rev(v1)), length(v1))
 #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
 #[1,]    1    9    9    9    9    9    9    9
 #[2,]    9    1    9    9    9    9    9    9
 #[3,]    9    9    1    9    9    9    9    9
 #[4,]    9    9    9    1    9    9    9    9
 #[5,]    9    9    9    9    1    9    9    9
 #[6,]    9    9    9    9    9    1    9    9
 #[7,]    9    9    9    9    9    9    1    9
 #[8,]    9    9    9    9    9    9    9    1
 #[9,]    1    9    9    9    9    9    9    9


embed(c(rev(v2),rev(v2)), length(v2))
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
# [1,]    1    5    5    5    3    2    5    7
# [2,]    7    1    5    5    5    3    2    5
# [3,]    5    7    1    5    5    5    3    2
# [4,]    2    5    7    1    5    5    5    3
# [5,]    3    2    5    7    1    5    5    5
# [6,]    5    3    2    5    7    1    5    5
# [7,]    5    5    3    2    5    7    1    5
# [8,]    5    5    5    3    2    5    7    1
# [9,]    1    5    5    5    3    2    5    7
数据
v1您可以创建一个矩阵并替换对角线,即

m1 <-matrix(data = 9, nrow = 8, ncol = 8)
diag(m1) <- 1
m1

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#[1,]    1    9    9    9    9    9    9    9
#[2,]    9    1    9    9    9    9    9    9
#[3,]    9    9    1    9    9    9    9    9
#[4,]    9    9    9    1    9    9    9    9
#[5,]    9    9    9    9    1    9    9    9
#[6,]    9    9    9    9    9    1    9    9
#[7,]    9    9    9    9    9    9    1    9
#[8,]    9    9    9    9    9    9    9    1

m1获得相同结果的另一种方法:

x <- c(1, rep(9, 7))
sapply(8:1, function(n)c(tail(x,-n),head(x,n)))

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    9    9    9    9    9    9    9
[2,]    9    1    9    9    9    9    9    9
[3,]    9    9    1    9    9    9    9    9
[4,]    9    9    9    1    9    9    9    9
[5,]    9    9    9    9    1    9    9    9
[6,]    9    9    9    9    9    1    9    9
[7,]    9    9    9    9    9    9    1    9
[8,]    9    9    9    9    9    9    9    1

x这似乎是实现整个序列的最优雅的方式,谢谢!我试图把它变成一个一行程序(没有诉诸
),但似乎找不到一种方法将对角调用包含在矩阵中,或者将矩阵包含在对角调用中。但是我可以用两条线来生活,而不是按照我的方式去做!谢谢这正是我在做的。谢谢:)这个解决方案的一行翻译:
“diagI有人介意解释一下一行吗?我不明白”diagI用倒勾替换了引号(这在评论中很难做到,但在这个上下文中更“合适”)@Haboryme这就是R中替换函数的工作方式。例如,调用
names(x)感谢您介绍了一种我从未想到过的方法!如果只替换序列中的多个值,则可以这样做。但是为了我所需要的目的,它有点复杂。这很好,除了序列的第一个元素结束在末尾!我不理解你的评论。最后一行应该是第一行。你是否在抱怨我没有打印出首字母
x
,如果是7,则循环到8?这只是为了说明这个解决方案是如何工作的。你不能在你的问题中说你想要索托斯答案中给出的精确矩阵。如果您不需要同时使用整个矩阵,并且内存消耗是一个问题,那么我的解决方案可能更可取。这不是抱怨。。。只是第一个序列应该先来-仅此而已
`diag<-`(matrix(data = 9, nrow = 8, ncol = 8),1)
x <- c(1, rep(9, 7))
sapply(8:1, function(n)c(tail(x,-n),head(x,n)))

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    1    9    9    9    9    9    9    9
[2,]    9    1    9    9    9    9    9    9
[3,]    9    9    1    9    9    9    9    9
[4,]    9    9    9    1    9    9    9    9
[5,]    9    9    9    9    1    9    9    9
[6,]    9    9    9    9    9    1    9    9
[7,]    9    9    9    9    9    9    1    9
[8,]    9    9    9    9    9    9    9    1