首先在写R-FAQ之前插播一下看到建立矩阵的几个方法:
比如我输入:
a<-matrix(1:20,nrow=4,byrow=T)
rownames(a)=LETTERS[1:4]
colnames(a)=letters[5:9]
则出来一个矩阵
这是最常规的方法,同时还有第二种方法:
第二种设立矩阵的方法
其中先设置一个向量,然后定义向量的维度(dim),维度是行、列顺序
最后,还有第三种方法
第三种矩阵设立方法
其中cbing和rbind为把向量/矩阵按照行列方式叠加
下面继续R-FAQ
【53】对数列进行变换
这里用到aperm函数,这个函数感觉比较绕
首先建立一个数列
数列a
这里的数列a是1:24整数,按照2行3列四组的形式排列
然后如果我要变换数列,就用到了aperm这个函数
aperm说的是对a这个数列进行变换,这个函数的含义是以前是(2,3,4),也就是行列组三个顺序,现在变换,是对行列组三个进行变换,所以既然是行列组,只有三个数,也就是aperm后面的参数是123三个数的不断排列组合。
如
按照1,2,3排列组合,就是没有变换顺序,b=a
按照3,2,1组合,也就是之前的2行3列4组,变成了4行3列2组
所以扩展下,aperm函数貌似只能变换(本来就是变换函数。。。),这个变换是内部的行列组之间的变换,如果我对原来a这个数列,234不满意,想形成622,6行2列2组的话,可以使用dim函数,即
变换组
【54】删除list中的元素
其实比较重要的就是索引,比如案例中的lst,利用lst[['a']]['b']索引到list中alist的b,然后赋值为NULL,就可以删除,亲测在array中无法使用该语句。同时利用$的索引也可以,比如lst$a$b语句达到同样效果
【55】行、列累加
利用cumsum函数;
这个号函数的逻辑如果是一个向量,则针对这个向量进行累计,如vec<-c(1,2,3,4,5),cumsum(vec)返回的是(1,1+2,1+2+3,1+2+3+4,1+2+3+4+5)
如果是一个矩阵,利用apply函数做计算,如
apply(matrix,y,cumsum)其中,y如果是1,就是对行加和,如果是2,就对列加和。
比如我定义一个矩阵,mat2,
想要对这个矩阵每个元素加2,则直接
apply(mat2,1,'+',2)
最后相当于转置了矩阵
而如果是apply(mat2,2,'+',2)的话,直接对每一列都加2形成
同时,也可以设置不同的Function,比如之前说的cumsum,即
apply(mat2,2,cumsum)
【56】向量极值
首先get到一个新函数是rev,就是转置函数,x<-rev(y)也就是翻转
pmax和pmin函数,求的是在相同向量个数中的极大值们和极小值们
如x<-1:10,y<-rev(x),pmax会返回十个最大值,pmin同理
【59】分组数据的统计,?apply函数
apply族的函数比较复杂, 在这里进行分类和说明一下。
在前面说过apply函数,矩阵行业转置的原因可能是在输入公式之后,由于只是对行进行运算,最后行程三个数列:a[1],a[2],a[3],举个例子
对于矩阵a,做apply(a,1,'*',2)相当于按行的每个元素均*2
最后也就是形成三个数列:a[1],a[2],a[3],a[1]]2,4,6,8以此类推;由于R的矩阵排列方式是按照列排列,很有可能最后行程三列矩阵,a1a2a3
同理,如果是apply(a,2,'*',2),就是按列相乘,就不会出现这个情况。
一般的加减乘除相当于矩阵相乘,也就是矩阵中的行列每个元素都要相乘,最后出来的还是矩阵样式,但是如果是sum这类函数,最后出来的是一个数字,也就不是矩阵了
【关于tapply】
tapply和apply函数比较类似,比如我假设一个向量m<-1:4,n<-c('e','e','f','g'),如果单纯的利用tapply的话,如tapply(m,n),相当于直接阐述n,也就是回到(1,1,2,3);
如果fun加载其他函数,如tapply(m,n,sum)则返回首列为n,对应的数值按照赋值加和的方式展示,如
其中e被赋值1,2,f=3 g=4,tapply求和对相同的数据求和(相当于excel数据透视表功能)
当然sum还可以扩展成mean,sd等函数
R-FAQ的例子其实就是赋值,简单点说,tapply针对向量,就是前一个给后一个赋值,然后对后一个进行处理的过程