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