【问题标题】:Rename the row and colnames in Matrix in R, length of 'dimnames' [1] not equal to array extent重命名 R 中 Matrix 中的行和列名,'dimnames' [1] 的长度不等于数组范围
【发布时间】:2014-04-02 00:50:57
【问题描述】:

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

我的功能是

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

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

【问题讨论】:

  • 您的意思是rownamescolnames 而不是row.namescol.names
  • 是的,一种,我基本上是想改变矩阵的行名和列名@Thomas
  • @Thomas 你知道答案吗?请?
  • 花点时间阅读下面我的回答。我很确定我对你做错的事情是正确的,不过,如果你提供数据(包括annotation),你会得到更好的答案。
  • 我无法将数据上传到这个网站...@BrodieG

标签: r matrix dataframe


【解决方案1】:

如果没有数据很难确定,但您几乎可以肯定想要这样的东西:

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

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

annotation$probeID==c(nameRow)

在那里,您将获取 nameRow 中的值,并将它们与 probeID 的值逐个值进行比较,而不管其中的顺序如何。那些恰好匹配的将返回 TRUE,因此您将获得一个带有但是,通过将这两个向量并排放置,您会随机获得许多匹配项。

换一种思考方式,上面的表达式只有在probeID 的长度与nameRownameColumn 的长度完全相同,并且包含与两者的顺序完全相同的值时才会按预期工作nameRownameColumn,此时你可以直接设置 rowGeneNamecolGeneName 等于 annotation$symbol

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

【讨论】:

  • 我把它改成了%in%,但是现在顺序没有错...@BrodieG
  • 您需要使用match%in% 只是 match 的退化版本,如果左操作数中的值在右操作数中,则返回 TRUE,但您需要知道右操作数中左侧的值在哪里,您可以使用match。看%in%的文档,这也是match的文档(%in%是用match实现的)。
  • 可以给我你的邮箱吗? @BrodieG
  • @ToBeGeek,在这回答了您的问题的范围内,请考虑将其作为答案进行检查。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 2017-03-18
  • 2016-12-01
  • 1970-01-01
相关资源
最近更新 更多