2014-02-28 58 views
0

我想寫一個函數來重命名矩陣的行和列。在R中重命名矩陣中的行和列名,'dimnames'[1]的長度不等於數組範圍

My功能是

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): 較長的對象長度不是較短的倍數對象長度

+0

你的意思是'rownames'和'colnames'而不是'row.names'和'col.names'嗎? – Thomas

+0

是的,我基本上想改變矩陣的行名和列名@Thomas – ToBeGeek

+0

@Thomas你知道答案嗎?請 ? – ToBeGeek

回答

2

很難確定沒有數據,但幾乎可以肯定想是這樣的:

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實際上會在第二個向量中搜索第一個向量的值,並返回匹配的第二個向量的索引位置。

+0

我將其更改爲以%爲單位的百分比,但順序現在沒有錯...... @ BrodieG – ToBeGeek

+0

你需要使用'match'。 '%in%'只是一個簡單版本的'match',如果左操作數中的值在右操作數中,則返回'TRUE',但您需要知道右操作數中的WHERE值,您可以用'match'做。查看'%in%'的文檔,這也是'match'的文檔('%in%'是用'match'實現的)。 – BrodieG

+0

我可以收到你的電子郵件嗎? @BrodieG – ToBeGeek