那么我们接下来就讲讲二维数组
创建一个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。
R语言的矩阵默认可以看成按列组成的向量,函数which可以判定那个位置上元素为不是零,根据位置判断其前后,以及前一列,后一列位置上的元素是不是为0,如当前是i,则前一个后一个分别为i-1,i+1,而前一列对应位置则为i-num.of.row-1,i-num.of.row,i-num.of.row+1,后一列i+num.of.row-1,i+num.of.row,i+num.of.row+1。特殊情况就是判断边界的时候进行出来,看我的例子:
m <- matrix(0,10,10)m[4,4] <-20
m[4,5] <-20
m[3,9] <-20
m[7,9] <-20
m
nr <- nrow(m)
nc <- ncol(m)
for(i in which(m!=0)){
#如果是第一列,不处理前列列
if(i<nr){
# 前一个 i-1,后一个i+1
# 下一列 i+nr-1,i+nr,i+nr+1
if(i%%nr==1){#如果是第一行
chs <- c(i+1,i+nr,i+nr+1)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
}
else if(i%%nr==0){#如果是最后一行
chs <- c(i-1,i+nr-1,i+nr)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
}else{
chs <- c(i-1,i+1,i+nr-1,i+nr,i+nr+1)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
} }
#如果是最后一列,不处理后一列
else if(i>nr*(nc-1)){
if(i%%nr==1){#如果是第一行
chs <- c(i-nr,i-nr+1,i+1)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
}
else if(i%%nr==0){#如果是最后一行
chs <- c(i-1,i-nr-1,i-nr)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
}else{
chs <- c(i-1,i+1,i-nr-1,i-nr,i-nr+1)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
}
}
#不是第一列也不是最后一列
else{
if(i%%nr==1){#如果是第一行
chs <- c(i-nr,i-nr+1,i+1,i+nr,i+nr+1)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
}
else if(i%%nr==0){#如果是最后一行
chs <- c(i-nr-1,i-nr,i-1,i+nr-1,i+nr)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
}else{
chs <- c(i-nr-1,i-nr,i-nr+1,i-1,i+1,i+nr-1,i+nr,i+nr+1)
for(j in chs){
if(m[j]==0){
m[j] <-1000
}
}
}
}
}
m
上个效果图:卧槽,我的浏览器抽风了,点插入图片没反应,自己运行吧