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



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

我的功能是

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,value):"dimnames"[1]的长度不等于数组范围此外:警告消息:在注释$probeID==c(nameRow)中:较长的对象长度不是较短对象长度的倍数

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

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

现在,您使用的将用一个长度不太可能是原始向量的向量覆盖行和列向量。查看表达式:

annotation$probeID==c(nameRow)

在那里,你将获取nameRow中的值,并将它们与probeID中的值逐值进行比较,而不考虑它们的顺序。那些恰好匹配的值将返回TRUE,因此,通过将这两个向量并排放置,你将获得一个随机匹配的向量。

另一种方法是,只有当probeIDnameRownameColumn的长度完全相同,并且and包含与nameRownameColumn的顺序完全相同的值时,上面的表达式才会按预期工作,此时您可以将rowGeneNamecolGeneName直接设置为等于annotation$symbol

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

相关内容

最新更新