R 创建矩阵,其中所有对角线在反对角线方向上的值相同

R 创建矩阵,其中所有对角线在反对角线方向上的值相同,r,matrix,R,Matrix,我肯定这类矩阵有个名字,但不确定。在R中,我想快速转换变量x: x = 1:10 x #[1] 1 2 3 4 5 6 7 8 9 10 进入一个矩阵,其中所有对角线(非主对角线)在一个方向上相同,反对角线方向: x 1 1 2 3 4 5 6 7 8 9 10 2 2 3 4 5 6 7

我肯定这类矩阵有个名字,但不确定。在
R
中,我想快速转换变量
x

x = 1:10
x  #[1]  1  2  3  4  5  6  7  8  9 10
进入一个矩阵,其中所有对角线(非主对角线)在一个方向上相同,反对角线方向:

    x
1   1       2       3       4       5       6       7       8       9      10
2   2       3       4       5       6       7       8       9      10      NA
3   3       4       5       6       7       8       9      10      NA      NA
4   4       5       6       7       8       9      10      NA      NA      NA
5   5       6       7       8       9      10      NA      NA      NA      NA
6   6       7       8       9      10      NA      NA      NA      NA      NA
7   7       8       9      10      NA      NA      NA      NA      NA      NA
8   8       9      10      NA      NA      NA      NA      NA      NA      NA
9   9      10      NA      NA      NA      NA      NA      NA      NA      NA
10 10      NA      NA      NA      NA      NA      NA      NA      NA      NA

谢谢

我们可以使用
数据表中的
shift

library(data.table)
do.call(cbind, shift(x, 0:9, type = 'lead'))
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    2    3    4    5    6    7    8    9    10
# [2,]    2    3    4    5    6    7    8    9   10    NA
# [3,]    3    4    5    6    7    8    9   10   NA    NA
# [4,]    4    5    6    7    8    9   10   NA   NA    NA
# [5,]    5    6    7    8    9   10   NA   NA   NA    NA
# [6,]    6    7    8    9   10   NA   NA   NA   NA    NA
# [7,]    7    8    9   10   NA   NA   NA   NA   NA    NA
# [8,]    8    9   10   NA   NA   NA   NA   NA   NA    NA
# [9,]    9   10   NA   NA   NA   NA   NA   NA   NA    NA
#[10,]   10   NA   NA   NA   NA   NA   NA   NA   NA    NA

baser
中,我们可以使用
embed

out <- embed(c(x, x), 10)
replace(out, lower.tri(out), NA)[, 10:1]
#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    2    3    4    5    6    7    8    9    10
# [2,]    2    3    4    5    6    7    8    9   10    NA
# [3,]    3    4    5    6    7    8    9   10   NA    NA
# [4,]    4    5    6    7    8    9   10   NA   NA    NA
# [5,]    5    6    7    8    9   10   NA   NA   NA    NA
# [6,]    6    7    8    9   10   NA   NA   NA   NA    NA
# [7,]    7    8    9   10   NA   NA   NA   NA   NA    NA
# [8,]    8    9   10   NA   NA   NA   NA   NA   NA    NA
# [9,]    9   10   NA   NA   NA   NA   NA   NA   NA    NA
#[10,]   10   NA   NA   NA   NA   NA   NA   NA   NA    NA
#[11,]   NA   NA   NA   NA   NA   NA   NA   NA   NA    NA

out这里的替代解决方案是使用
base R

f <- function(x) {
  y <- x:10
  length(y) <- 10
  return(y)
}

sapply(x, f)

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

f谢谢,但这不是很灵活,它只适用于
1:10
,假设你有
x,我假设x是你给出的数字序列。肯定会更新我的代码。@user63230如果您选中
class(out)
对不起,我指的是矩阵的名称……标识等?@user63230对不起,我不知道它叫什么名字。