首页 > 代码库 > 与R纠缠的两件事——rownames和子集--转载

与R纠缠的两件事——rownames和子集--转载

与R语言纠缠了一个星期,从快速上手的暗暗得意,到之后某些细节的纠结烦躁,过山车式体验中,我逐渐才认识了真实的R语言。

期间遇到两个很烦恼的问题,一个是让人烦躁抓狂,另一个是无意发现的重大错误。

1.      令人抓狂的rownames

若数据矩阵datamatrix如图1,无列名和行名及表头。若c1~c4分别为colnames,而r1~r5为rownames,表头为A。

技术分享图1:datamatrix

如何添加c1~c4?r1~r5?

coln = c(”c1”,”c2”,”c3”,”c4”)

rown = c(”r1”,”r2”,”r3”,”r4”,”r5”)

colnames(datamatrix) = coln

rownames(datamatrix) = rown

如何添加表头A?

colnames(datamatrix) = c(“A”,”c1”,”c2”,”c3”,”c4”)

上述命令会直接报错,列数不匹配。

colnames(datamatrix)[1] = “A”

上命令会让矩阵变成?如图2所示

技术分享图2:datamatrix

究其本质,都是因为colnames()函数默认调用的都是真实数据上(x1~x4)的列名,而不认识行名上(r1~r5)的列名。

       正确添加表头命令为:

       datamatrix= cbind(rownames(datamatrix),datamatrix)#将行名加入矩阵

       rownames(datamatrix)[1]= “A”

实现后矩阵如图3,

技术分享图3:datamatrix

另外

?read.table或wirte.table中也有row.names和col.names条件格式。与上rownames和colnames不仅书写上有区别,意义上也有。row.names用于指定行名。数值为k时,则将第k列设置为列名,并将其从数据矩阵中移除。而write.table中row.names=F将矩阵的行名剔除后写进table.

2.      子集选取("numeric"和"character"之争)

genename =

            CRHBP,….

mode(genename)  =

         “numeric”

m1 为如下矩阵

技术分享图4:m1

mode(m1)  =

           "numeric"?

若要在m1中选取genename对应的id所在行的子集,命令应该为:

m1[genename,]

?但结果很诡异,返回的并不是id对应为CRHBP所在行,返回却是CRHR1所在行

 

要想返回所选的行,必须先将genename转换为character类型,才是准确的。

genename <- as.character(genename)

m1[genename,]

此时,结果才?为所求行。

与R纠缠的两件事——rownames和子集--转载