R语言入门笔记(2) - R语言科学计算

R语言科学计算

分类统计

  • mean(),求平均值
  • min(),求最小值
  • sd(),求标准差

数组和矩阵

数组与矩阵的维数

用dim函数来定义向量空间的维数。
例:

> my_num <- c(1:10)
> dim(my_num) <- c(2,5)
> my_num
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

切片

索引向量

array函数

array函数根据维数参数生成多维数组,它的参数主要有两个,第一个是需要形成数组元素的数据,第二个是dim参数提示维度。
例:

> h1 <- c(1:20)
> mya1 <- array(h1, dim=c(4,5))
> mya1
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9   13   17
[2,]    2    6   10   14   18
[3,]    3    7   11   15   19
[4,]    4    8   12   16   20

数组转换为向量

as.vector函数可将数组转换为向量。
例:

> x4 <- array(c(1:10), dim=c(2,5))
> x4
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> as.vector(x4)
 [1]  1  2  3  4  5  6  7  8  9 10

matrix矩阵

使用matrix函数可创建矩阵,主要参数为:data表示构造所需数据,nrow为行数,ncol为列数,byrow表示是否按行顺序分配元素,默认为FALSE。
例:

> matrix(c(1:10),2,5,TRUE)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
> matrix(c(1:10),2,5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10

对角矩阵

通过diag函数可生成和分析对角矩阵。如果参数为一维数组,则将参数视为对角线元素,并生成对角矩阵。

例:

> a1 = c(1:10)
> diag(a1)
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    1    0    0    0    0    0    0    0    0     0
 [2,]    0    2    0    0    0    0    0    0    0     0
 [3,]    0    0    3    0    0    0    0    0    0     0
 [4,]    0    0    0    4    0    0    0    0    0     0
 [5,]    0    0    0    0    5    0    0    0    0     0
 [6,]    0    0    0    0    0    6    0    0    0     0
 [7,]    0    0    0    0    0    0    7    0    0     0
 [8,]    0    0    0    0    0    0    0    8    0     0
 [9,]    0    0    0    0    0    0    0    0    9     0
[10,]    0    0    0    0    0    0    0    0    0    10

数组运算

数组四则运算

+, -, * 运算,每个元素分别进行。

向量连接

向量连接指的是将两个向量通过某种规律连接成一个数组。R语言的cbind和rbind函数可进行向量连接。
概略地说,cbind() 把矩阵横向合并成一个大矩阵(列方式),而rbind()
是纵向合并(行方式)。
在命令中

> X <- cbind(arg 1 , arg 2 , arg 3 , ...)

cbind() 的参数要么是任何长度的向量,要么是列长度一致的的矩阵(即行数一样)。结果将是一个合并arg1 , arg2 , . . . 的列形成的矩阵。
如果cbind() 的参数中有一些比其他矩阵参数的列长度短的向量,它们将会被循环使用以吻合矩阵的列长度(在没有矩阵的情况下,吻合其中最长向量的长度)。
函数rbind() 对行进行类似的操作。其中任何向量参数都会被当作行向量且可能被循环使用。
假定X1 和X2 有一样的行数。下面的命令会把它们的列合并以得到矩阵X,同时要求起始列都是1.

> X <- cbind(1, X1, X2)

rbind() 或者cbind() 返回值常常是矩阵形式。因此,cbind(x)rbind(x) 可能是把向量x 分别转换成列或者行矩阵最简单的方法。

> x2 <- c(101:105)
> x1 <- c(1:10)
> cbind(x1,x2)
      x1  x2
 [1,]  1 101
 [2,]  2 102
 [3,]  3 103
 [4,]  4 104
 [5,]  5 105
 [6,]  6 101
 [7,]  7 102
 [8,]  8 103
 [9,]  9 104
[10,] 10 105
> rbind(x1,x2)
   [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
x1    1    2    3    4    5    6    7    8    9    10
x2  101  102  103  104  105  101  102  103  104   105

矩阵运算

矩阵连接

R语言的cbind函数完成矩阵的横向连接,rbind函数完成矩阵的纵向连接。
例:

> x3 <- matrix(c(1:10),2,5)
> x4 <- matrix(c(101:105),2,5)
> x3
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> x4
     [,1] [,2] [,3] [,4] [,5]
[1,]  101  103  105  102  104
[2,]  102  104  101  103  105
> cbind(x3,x4)
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1    3    5    7    9  101  103  105  102   104
[2,]    2    4    6    8   10  102  104  101  103   105
> rbind(x3,x4)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
[3,]  101  103  105  102  104
[4,]  102  104  101  103  105

矩阵转置

R语言的t函数可完成矩阵转置计算
例:

> h <- c(1:10)
> array(h, dim=c(2,5)) -> mya
> mya
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
> t(mya)
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
[4,]    7    8
[5,]    9   10

相对t函数而言,用aperm函数进行矩阵转置更灵活。aperm有两个常用的参数,第一个参数是需要转置的矩阵,第二个参数perm指示新矩阵相对于第一个参数矩阵的维度下标。
比如,将行转换为列,将列转换为行,将行列次序更换,将第一维的元素与第二维的元素互换,则将perm设为c(2,1).
例:

> aperm(mya,perm=c(2,1)) -> myb
> myb
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
[4,]    7    8
[5,]    9   10
> mya1 <- array(mya,c(2,2,5))
> mya1
, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

, , 3

     [,1] [,2]
[1,]    9    1
[2,]   10    2

, , 4

     [,1] [,2]
[1,]    3    5
[2,]    4    6

, , 5

     [,1] [,2]
[1,]    7    9
[2,]    8   10

> myb1 <- aperm(mya1,perm=c(2,1,3))
> myb1
, , 1

     [,1] [,2]
[1,]    1    2
[2,]    3    4

, , 2

     [,1] [,2]
[1,]    5    6
[2,]    7    8

, , 3

     [,1] [,2]
[1,]    9   10
[2,]    1    2

, , 4

     [,1] [,2]
[1,]    3    4
[2,]    5    6

, , 5

     [,1] [,2]
[1,]    7    8
[2,]    9   10

矩阵乘积

若A为mn矩阵,B为nr矩阵,则它们的乘积AB(有时记做AB)会是一个mr的矩阵。矩阵乘积使用%*%操作符进行计算。
例:

> a2 <- array(c(1:10),dim=c(2,5))
> b2 <- t(a2)
> a2 %*% b2
     [,1] [,2]
[1,]  165  190
[2,]  190  220

内积运算

向量外积

向量的外积是矩阵的克罗内克积的特殊情况,而克罗内克积是张量积的一种特殊情况。

> b1 <- array(c(1:4))
> a1 <- array(c(5:6))
> b1 %o% a1
     [,1] [,2]
[1,]    5    6
[2,]   10   12
[3,]   15   18
[4,]   20   24
> a1 %o% b1
     [,1] [,2] [,3] [,4]
[1,]    5   10   15   20
[2,]    6   12   18   24
> b2 <- array(c(1:4))
> a2 <- array(c(5:8))
> b2 %o% a2
     [,1] [,2] [,3] [,4]
[1,]    5    6    7    8
[2,]   10   12   14   16
[3,]   15   18   21   24
[4,]   20   24   28   32

此外,还可以使用outer(a,b,'*')替代%o%运算符进行外积运算.

向量内积

向量内积以实数R上定义的两个向量为运算对象,返回一个实数标量值,属于二元运算,它是欧基里得空间的标准内积。
R语言通过corssprod函数完成向量内积运算.
例:

> a3 <- c(1:3)
> b3 <- c(4:6)
> crossprod(a3,b3)
     [,1]
[1,]   32

矩阵内积

矩阵内积的计算方式相当于第一个参数的转置乘以第二个参数,就是前面提到的矩阵乘积。除了使用%*%操作符外,还可以使用crossprod函数完成矩阵内积计算。

求解线性方程组

一般通过solve函数来求解 a %*% x = b中的x向量值。求解线性方程组仅使用solve函数的前两个参数,第一个a为系统矩阵,第二个b为常数项,当b缺失时,默认为单位矩阵。

> b10
     [,1]
[1,]    8
[2,]    9
> a10
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> solve(a10,b10)
     [,1]
[1,] -2.5
[2,]  3.5

矩阵求逆

通过solve函数可进行矩阵求逆计算,只指定1个参数(待求逆的矩阵)即可。
例:

> a10
     [,1] [,2]
[1,]    1    3
[2,]    2    4
> solve(a10)
     [,1] [,2]
[1,]   -2  1.5
[2,]    1 -0.5

矩阵的特征值求解

R语言通过eigen函数可求解特征值。

> a11 <- array(c(1:16),dim=c(4,4))
> a11
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
> eigen(a11)
$values
[1]  3.620937e+01 -2.209373e+00  1.599839e-15  7.166935e-16

$vectors
          [,1]        [,2]       [,3]       [,4]
[1,] 0.4140028  0.82289268 -0.5477226  0.1125155
[2,] 0.4688206  0.42193991  0.7302967  0.2495210
[3,] 0.5236384  0.02098714  0.1825742 -0.8365883
[4,] 0.5784562 -0.37996563 -0.3651484  0.4745519

求解矩阵行列式

> a16 <- array(c(3:6),dim=c(2,2))
> a16
     [,1] [,2]
[1,]    3    5
[2,]    4    6
> det(a16)
[1] -2

奇异值分解

使用R语言的svd函数可完成奇异分解。

> a20 <- array(c(1:16),dim=c(4,4))
> a20
     [,1] [,2] [,3] [,4]
[1,]    1    5    9   13
[2,]    2    6   10   14
[3,]    3    7   11   15
[4,]    4    8   12   16
> svd(a20)
$d
[1] 3.862266e+01 2.071323e+00 2.076990e-15 4.119458e-16

$u
           [,1]       [,2]        [,3]       [,4]
[1,] -0.4284124 -0.7186535  0.43803202  0.3288281
[2,] -0.4743725 -0.2738078 -0.82913672 -0.1119477
[3,] -0.5203326  0.1710379  0.34417739 -0.7625890
[4,] -0.5662928  0.6158835  0.04692732  0.5457086

$v
           [,1]        [,2]       [,3]       [,4]
[1,] -0.1347221  0.82574206  0.5322301 -0.1293488
[2,] -0.3407577  0.42881720 -0.6132292  0.5691660
[3,] -0.5467933  0.03189234 -0.3702319 -0.7502855
[4,] -0.7528288 -0.36503251  0.4512310  0.3104683
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容