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()。
强制转换为向量:as.vector(),或者直接c().
matlab多维数组操作1.一个三维数组由行、列和页三维组成,其中每一页包含一个由行和列构成的二维数组。
2.利用标准数组函数创建多维数组
A=zeros(4,3,2) 生成一个4行3列2页的三维全0数组,ones,rand和randn等函数有相似的用法。
3.利用直接索引方式生成多维数组
A=zeros(2,3)
A(:,:,2)=ones(2,3)
A(:,:,3)=4
上面的代码先生成一个二维数组作为三维数组的第一页,然后通过数组直接索引,添加第二页、第三页。
4.利用函数reshape和repmat生成多维数组
B=reshape(A,2,9)
B=[A(:,:,1) A(:,:,2) A(:,:,3)] %结果与上面一样。
reshape(B,2,3,3)
reshape(B,[2 3 3]) %结果与上面一样。
提示:reshape函数可以将任何维数的数组转变成其他维数的数组。
5.利用repmat函数生成多维数组
C=ones(2,3)
之前我们讲了向量,向量就仿佛一个一维数组一样
那么我们接下来就讲讲二维数组
创建一个matrix需要用到matrix函数
martix(参数1,nrow=行数,ncol=列数,byrow=布尔值)
参数1:matrix初始化的值,如果给出的值不够matrix长度将重复赋值,如果给出的值溢出将会报错。
参数byrow:这是一个布尔值如果给定TRUE,初始数据按行顺序推进,反之按列顺序推进。
这里说一下R语言中 ' . ' 并没有特殊的意义,只是变量名的一部分
读取矩阵我们用到:矩阵名[行,列]
这里的行和列可以接收单个数组也可以接收一个向量
当然如果是负数和向量一样就是排除掉对应索引指向的值
test.m[2, ] #取第二行,我们注意这里把列的地方空出来就是显示所有列
test.m[ ,2] #取第二列
test.m[2,2] #取第二行第二个
我们也可以给索引一个向量 比如3:4或者c(1,4)之类的,如上图所示,索引值也可以不连续
我们知道在二维表中 我们通常给每一行每一列取一个名字
矩阵中我们也可以这样做
首先我们给每一行每一列取一个名字,用向量保存
之后我们使用rownames(矩阵名)<-存有名字的向量给每行取名,给列取名同理见上图
取名之后我们可以用名称代替下标访问,例如:test.m['2nd','二']
看到这里,我真的觉得数据分析相关专业十分的艰难,需要用一些稀奇古怪的东西来进行数据分析
因为本人是计科专业的,平时用的数组就是单纯的数组,R语言的数组我一开始是令我怀疑人生的。
创建一个数组我们需要用到array函数
array(data=数组中的数据从1维平铺, dim=给定一个数值型向量, dimnames=list(包含一维名称的向量,二维名称....))
其中data参数用来给出数组的数据从第一维第一个开始顺序向后平铺
dim给定数组的纬度和每纬的宽度
dimnames给每个纬度的每格的名字 #这个参数可以忽略
至于如何读取数组中的数据和矩阵一致这里不再叙述,只不过把二维改成多维的情况。
我截完图发现arr[2,2,2]这个例子并不好,如果我们查看arr[3,2,1]将会显示6。