R函数-diag()

diag()提取或替换一个矩阵的对角线,或构造一个对角矩阵。
语法:
diag(x = 1, nrow, ncol)
diag(x) <- value
解析:
x:一个矩阵,向量或一维数组,或不填写。
nrow, ncol:可选 行列。
value :对角线的值,可以是一个值或一个向量。

例子

> x <- matrix(1:16,nrow=4,ncol=4)
> x
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
> diag(x)
[1]  1  6 11 16
#展示x的对角线数据

> diag(diag(x))
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    6    0    0
[3,]    0    0   11    0
[4,]    0    0    0   16
#由x的对角线数据生成对角矩阵

> diag(4)
     [,1] [,2] [,3] [,4]
[1,]    1    0    0    0
[2,]    0    1    0    0
[3,]    0    0    1    0
[4,]    0    0    0    1
#对角线为4个元素每个元素默认为1的对角矩阵

> diag(10,3,4)
     [,1] [,2] [,3] [,4]
[1,]   10    0    0    0
[2,]    0   10    0    0
[3,]    0    0   10    0
#对角线数据位10,三行四列的矩阵
> a<-diag(4)+1
> a
     [,1] [,2] [,3] [,4]
[1,]    2    1    1    1
[2,]    1    2    1    1
[3,]    1    1    2    1
[4,]    1    1    1    2

看几个较复杂的例子
例1

> all(diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 1:3; m})
[1] TRUE

吃瓜群众,表示不明白,拆开一点点看
1、大括号内:生成一个数值都是0的3*3矩阵m

> m <- matrix(0,3,3)
> m
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    0    0
[3,]    0    0    0

2、将m的对角线数据赋值为1、2、3

> diag(m) <- 1:3
> m
     [,1] [,2] [,3]
[1,]    1    0    0
[2,]    0    2    0
[3,]    0    0    3

3、判断等式两边的矩阵数值是否相等

> diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 1:3; m}
     [,1] [,2] [,3]
[1,] TRUE TRUE TRUE
[2,] TRUE TRUE TRUE
[3,] TRUE TRUE TRUE

给个例子A看了就更清晰了

> diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 3:5; m}
      [,1]  [,2]  [,3]
[1,] FALSE  TRUE  TRUE
[2,]  TRUE FALSE  TRUE
[3,]  TRUE  TRUE FALSE

all() 给定一组逻辑向量,判断所有的值都正确与否,全部相等返回TRUE

> all(diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 3:5; m})
[1] FALSE
> all(diag(1:3) == {m <- matrix(0,3,3); diag(m) <- 1:3; m})
[1] TRUE

例2

> diag(var(M <- cbind(X = 1:5, Y = stats::rnorm(5))))
        X         Y 
2.5000000 0.6281205 

拆开看看
1、取stats包中的5个随机数并赋值给Y
stats::rnorm
指定使用stats包里的rnorm函数,因为有可能同时多个包里有rnorm函数

> Y = stats::rnorm(5)
> Y
[1]  0.1492229 -0.2466619  1.3518855  0.5641860 -0.1353419

2、合并两个向量

> cbind(X = 1:5, Y = stats::rnorm(5))
     X          Y
[1,] 1 -2.5293372
[2,] 2  0.1422790
[3,] 3 -1.8053848
[4,] 4  0.8951704
[5,] 5 -1.5458680

3、将合并后的矩阵赋值给M并取矩阵M的方差
var()求方差
R语言的var计算的是样本方差

> var(M <- cbind(X = 1:5, Y = stats::rnorm(5)))
          x         y
x 2.5000000 0.1252164
y 0.1252164 0.8315106

疑问,矩阵的方差?如何计算呢?

> M
     x y
[1,] 1 5
[2,] 2 6
[3,] 3 7
> var(M)
  x y
x 1 1
y 1 1

4、所以这条语句的意思是取步骤3中矩阵的对角线

> diag(var(M <- cbind(X = 1:5, Y = stats::rnorm(5))))
        x         y 
2.5000000 0.8315106 

例3

> rownames(M) <- c(colnames(M),rep("",3))
> M
  x           y
x 1 -0.91441252
y 2  1.52303629
  3 -0.41773804
  4 -0.01641658
  5  0.10574677

1、rep(“”,3) 把”“重复3次

> rep("",3)
[1] "" "" ""

2、colnames(M) 显示M的列名

> colnames(M)
[1] "X" "Y"

3、把M的行命名

> rownames(M) <- c(colnames(M),rep("",3))
> M
  x           y
x 1 -0.91441252
y 2  1.52303629
  3 -0.41773804
  4 -0.01641658
  5  0.10574677
  • 13
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值