我想写一个函数来重命名矩阵行和列。
我的功能是
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)中: 较长的物体长度不是较短物体长度的倍数
答案 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
的长度与nameRow
和nameColumn
的长度完全相同,则上述表达式只能按预期工作,并且包含完全相同的值与nameRow
和nameColumn
的顺序相同,此时您可以将rowGeneName
和colGeneName
设置为直接等于annotation$symbol
。
match
实际上将搜索第二个向量中第一个向量的值,并返回匹配的第二个向量的索引位置。