【数据分析与挖掘】R语言矩阵Matrix与数组Array

【数据分析与挖掘】R语言矩阵Matrix与数组Array,第1张

之前我们讲了向量,向量就仿佛一个一维数组一样

那么我们接下来就讲讲二维数组

创建一个matrix需要用到matrix函数

martix(参数1,nrow=行数,ncol=列数,byrow=布尔值)

参数1:matrix初始化的值,如果给出的值不够matrix长度将重复赋值,如果给出的值溢出将会报错。

参数byrow:这是一个布尔值如果给定TRUE,初始数据按行顺序推进,反之按列顺序推进。

这里说一下R语言中 ' ' 并没有特殊的意义,只是变量名的一部分

读取矩阵我们用到:矩阵名[行,列]

这里的行和列可以接收单个数组也可以接收一个向量

当然如果是负数和向量一样就是排除掉对应索引指向的值

testm[2, ]    #取第二行,我们注意这里把列的地方空出来就是显示所有列

testm[ ,2]     #取第二列

testm[2,2]    #取第二行第二个

我们也可以给索引一个向量 比如3:4或者c(1,4)之类的,如上图所示,索引值也可以不连续

我们知道在二维表中 我们通常给每一行每一列取一个名字

矩阵中我们也可以这样做

首先我们给每一行每一列取一个名字,用向量保存

之后我们使用rownames(矩阵名)<-存有名字的向量给每行取名,给列取名同理见上图

取名之后我们可以用名称代替下标访问,例如:testm['2nd','二']

看到这里,我真的觉得数据分析相关专业十分的艰难,需要用一些稀奇古怪的东西来进行数据分析

因为本人是计科专业的,平时用的数组就是单纯的数组,R语言的数组我一开始是令我怀疑人生的。

创建一个数组我们需要用到array函数

array(data=数组中的数据从1维平铺, dim=给定一个数值型向量, dimnames=list(包含一维名称的向量,二维名称))

其中data参数用来给出数组的数据从第一维第一个开始顺序向后平铺

dim给定数组的纬度和每纬的宽度

dimnames给每个纬度的每格的名字    #这个参数可以忽略

至于如何读取数组中的数据和矩阵一致这里不再叙述,只不过把二维改成多维的情况。

我截完图发现arr[2,2,2]这个例子并不好,如果我们查看arr[3,2,1]将会显示6。

在R中尽量使用 <- 进行赋值, <- 更标准。在R中使用 = 进行赋值可能会出现错误(有些函数会将其解释为判断)——因为R起源于S语言,S语言的定义如此。

模式-使用mode()可以查看对象的数据类型

长度-使用length()可以查看对象的长度

标量可以是数字、字符、逻辑值等。

结果

向量可以由单个或多个值组成,多值的向量只能由相同类型的值组成,有一维和多维向量。

向量用于存储数值型、字符型、逻辑型数据

isna()判断是否为缺失值,返回一个逻辑性向量

将自变量连接成一个字符串。

一般的使用形式是paste (, sep = " ", collapse = NULL), 表示想要连接的不同自变量,sep表示不同自变量之间添加的符号,collapse打开之后表示将整个自变量变成一个单一的变量

对对象进行重复

在统计学中,按照变量值是否连续把变量分为连续变量与离散变量两种。分类变量是说明事物类别的一个名称,其取值是分类数据。变量值是定性的,表现为互不相容的类别或属性。因子就是一类分类离散变量。

因子是带有水平(level)的向量。

factor()函数一般形式为:

可以用来筛选因子的level

Table()函数对应的就是统计学中的列联表,是一种记录频数的方法。对于因子向量,可用函数table()来统计各类数据的频率。Table()的结果是一个带元素名的向量,元素名为因子水平,元素值为该水平的出现频率。

tapply()是对向量中的数据进行分组处理,而非对整体数据进行处理。函数一般形式为:

gl()函数可以方便地产生因子,函数一般形式为:

矩阵是一个二维数组,只是每个元素都拥有相同的数据类型(数值型、字符型或逻辑型)。注意与数据框的差别,数据框不同列的数据类型可以不同。

函数matrix ()是构造矩阵(二维数组)的函数,其构造形式为:

数组与矩阵类似,但是维度可以大于2。数组有一个特征属性叫做维数向量(dim属性),维数向量是一个元素取正整数值的向量,其长度是数组的维数,比如维数向量有两个元素时数组为二维数组(矩阵)。维数向量的每一个元素指定了该下标的上界,下标的下界总为1。

R软件可以用array()函数直接构造数组,其构造形式为:

数据框与矩阵类似,为二维,其数据框中各列的数据类型可以不同,但是长度必须一样。数据框在生物数据中用得比较多,是非常重要的一类数据类型。

数据框与矩阵不同的是数据框不同的列可以是不同的数据类型,并且数据框假定每列是一个变量,每行是一个观测值。

作为数据框变量的向量、因子或矩阵必须具有相同的长度(行数)。数据框可以用dataframe()函数生成,其用法与list()函数相同。

dataframe(col1,col2,col3)其中列向量col1,col2等可以是任何类型的向量

列表可以储存不同类型的数据,是一些对象的有序集合。它的元素也由序号(下标)区分,但是各元素的类型可以是任意对象,不同元素不必是同一类型。元素本身允许是其他复杂数据类型。比如一个列表的元素也允许是一个列表。

R软件中利用函数list()构造列表,一般语法为:

Lst<-list(name_1=object_1,…, name_1=object_m)

其中name是列表元素的名称;object_i(i=1,…,m)是列表元素的对象。

unlist()函数:将list函数拉直成一个向量

R语言数组和矩阵

1 数组

数组可以看成一个由递增下标表示的数据项的集合,例如数值。

数组的生成

如果一个向量需要在R中以数组的方式被处理,则必须含有一个维数向量作为它的dim属性。

维度向量由dim()指定,例如,z是一个由1500个元素组成的向量。下面的赋值语句

> dim(z) <- c(3,5,100) 使它具有dim属性,并且将被当作一个3X5X100的数组进行处理。 c(3,5,100) 就是他的维度向量。

还可以用到像matrix()和array()这样的函数来赋值。比如

> array(1:20, dim=c(4,5))

> matrix(1:24, 3,4)

数据向量中的值被赋给数组中的值时,将遵循与FORTRAN相同的原则"主列顺序",即第一个下标变化的最快,最后的下标变化最慢。

数组的运算

数组可以在算数表达式中使用,结果也是一个数组,这个数组由数据向量逐个元素的运算后组成,通常参与运算的对象应当具有相同的dim属性。

2 数组的索引和数组的子块

数组中的单个元素可以通过下标来指定,下标由逗号分隔,写在括号内。

我们可以通过在下标的位置给出一个索引向量来指定一个数组的子块,不过如果在任何一个索引位置上给出空的索引向量,则相当于选取了这个下标的全部范围。

如a[2,,],a[,3,]等

3 索引数组

除了索引向量,还可以使用索引数组来指定数组的某些元素。

例如:有4X5的数组a,若要得到a中的a[1,3], a[2,2] 和a[3,1]这三个元素,可以生成索引向量i,然后用a[i]得到它们。

> a <- array(1:20,dim=c(4,5)) # Generate a 4 by 5 array

> i <- array(c(1:3,3:1),dim=c(3,2))

> i

[,1] [,2]

[1,] 1 3

[2,] 2 2

[3,] 3 1

> a[i]

[1] 9 6 3

> a[i] <- 0 # 将这三个元素用0替换。

4 向量,数组的混合运算

表达式从左到右被扫描;

参与运算的任意对象如果大小不足,都将被重复使用直到与其他参与运算的对象等长;

当较短的向量和数组在运算中相遇时,所有的数组必须具有相同的dim属性,否则返回一个错误;

如果有任意参与运算的向量比参与运算的矩阵或数组长,将会产生错误;

如果数组结构正常声称,并且没有错误或者强制转换被应用于向量上,那么得到的结果与参与运算的数组具有相同的dim属性。

5 矩阵的运算

构建分区矩阵:cbind()和rbind(),cbind()按照水平方向,或者说按列的方式将矩阵连接到一起。rbind()按照垂直的方向,或者说按行的方式将矩阵连接到一起。

外积: *** 作符是%o%:

> ab <- a %o% b 或者

> ab <- outer(a, b, "")

其中的乘法 *** 作可以由任意一个双变量的函数替代。

广义转置:函数t(A),或aperm(A, c(2,1));

获取行数/列数:nrow(A)和ncol(A)分别返回矩阵A的行数和列数。

矩阵乘法: *** 作符为%%;

交叉乘积(cross product):crossprod(X,Y)等同于t(X) %% y,crossprod(X)等价于crossprod(X, X);

diag(v):如果v是向量,diag(v)返回一个由v的元素为对角元素的对角矩阵。

如果v为矩阵,diag(v)返回一个由v主对角元素组成的向量。

如果v只是一个数值,那么diag(v)是一个vXv的单位矩阵。

特征值和特征向量:eigen(Sm)。这个函数的结果是由名为values和vectors的两部分组成的列表。如果只是需要特征值:eigen(Sm)$values

最小二乘拟合即QR分解:lsfit(), qr()。

强制转换为向量:asvector(),或者直接c()

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/12181632.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存