沿序列移动值
Move value along a 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
本质上,我有一个保持不变的序列,但我想移动一个值,一次移动一个 space。
显然我可以用与我所做的类似的方式写出来,但我的实际序列要大得多,所以这不太实用。我对此的搜索有些徒劳,因此我们将不胜感激。谢谢
您可以使用 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
显然,这会移动所有值,如果序列中有两个以上的不同值,则可能不是您要查找的值。你的问题有点不清楚。
一个选项是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 <- c(1, 9, 9, 9, 9, 9, 9, 9)
v2 <- c(1, 5, 5, 5, 3, 2, 5, 7)
您可以创建一个矩阵并替换对角线,即
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
一个衬里是:
`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
我的目标是制作这样的序列:
> 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
本质上,我有一个保持不变的序列,但我想移动一个值,一次移动一个 space。
显然我可以用与我所做的类似的方式写出来,但我的实际序列要大得多,所以这不太实用。我对此的搜索有些徒劳,因此我们将不胜感激。谢谢
您可以使用 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
显然,这会移动所有值,如果序列中有两个以上的不同值,则可能不是您要查找的值。你的问题有点不清楚。
一个选项是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 <- c(1, 9, 9, 9, 9, 9, 9, 9)
v2 <- c(1, 5, 5, 5, 3, 2, 5, 7)
您可以创建一个矩阵并替换对角线,即
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
一个衬里是:
`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