我想写一个函数来重命名矩阵的行和列。
我的功能是
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<-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,因此,通过将这两个向量并排放置,你将获得一个随机匹配的向量。
另一种方法是,只有当probeID
与nameRow
和nameColumn
的长度完全相同,并且and包含与nameRow
和nameColumn
的顺序完全相同的值时,上面的表达式才会按预期工作,此时您可以将rowGeneName
和colGeneName
直接设置为等于annotation$symbol
。
match
将实际搜索第二个向量中第一个向量的值,并返回匹配的第二个矢量的索引位置。