重命名R中Matrix的行和列,'dimnames'[1]的长度不等于数组范围

时间:2014-02-28 20:16:24

标签: r matrix dataframe

我想写一个函数来重命名矩阵行和列。

我的功能是

changeMatrixName<- function(mat){
     nameRow<-vector(mode="character",length=nrow(mat))
     nameCol<-vector(mode="character",length=ncol(mat))
     nameCol<- colnames(mat)
     nameRow<- rownames(mat)
     #annotation[annotation$probeID==c("ILMN_1814092","ILMN_1668851"),]$symbol
     rowGeneName<-vector(mode="character",length=nrow(mat))
     colGeneName<-vector(mode="character",length=ncol(mat))


     rowGeneName<-annotation[annotation$probeID==c(nameRow),]$symbol
     colGeneName<-annotation[annotation$probeID==c(nameCol),]$symbol
     row.names(mat)<-rowGeneName
     col.names(mat)<-colGeneName
     return(mat)
  }

我有一个像

这样的测试矩阵
      ILMN_1814092 ILMN_1805104 ILMN_2070570 ILMN_2232084 ILMN_1704579
 ILMN_1802380 4.972073e-03  0.016279737 0.0076933191 0.0214107369  0.001951975
 ILMN_1753196 2.222289e-04  0.080954797 0.0389565797 0.0220420297  0.002545084
 ILMN_1753830 1.657137e-05  0.009063726 0.0004676619 0.0008824427  0.007684124

当我跑步时

TEST2&LT; -changeMatrixName(测试)

  

rownames<-中的错误(x,值):           'dimnames'[1]的长度不等于数组范围           另外:警告信息:           在注释$ probeID == c(nameRow)中:              较长的物体长度不是较短物体长度的倍数

1 个答案:

答案 0 :(得分:2)

没有数据很难确定,但你几乎肯定想要这样的东西:

rowGeneName <- annotation[match(nameRow, annotation$probeID),]$symbol
colGeneName <- annotation[match(nameCol, annotation$probeID),]$symbol

现在,您正在使用的内容将使用长度不太可能是原始向量的向量覆盖您的行和col向量。看表达式:

annotation$probeID==c(nameRow)

在那里,你将获取nameRow中的值,并将它们的值与probeID的值进行比较,而不管其中的顺序。碰巧匹配的那些将返回TRUE,因此你将获得一个向量然而,通过将这两个向量并排放置,您可以随机获得许多匹配。

另一种思考方式,如果probeID的长度与nameRownameColumn的长度完全相同,则上述表达式只能按预期工作,并且包含完全相同的值与nameRownameColumn的顺序相同,此时您可以将rowGeneNamecolGeneName设置为直接等于annotation$symbol

match实际上将搜索第二个向量中第一个向量的值,并返回匹配的第二个向量的索引位置。