2014-01-06 81 views
1

搜索了幾個不同的主題,但沒有找到完全相同的問題。我有一個平方相關矩陣,其中行/列名稱是基因。下面的矩陣切片。如何使用for循環從矩陣中提取特定單元格?

   Xelaev15073085m Xelaev15073088m Xelaev15073090m Xelaev15073095m 
Xelaev15000002m  0.1250128  -0.6368677  0.3119062  0.3980826 
Xelaev15000006m  0.4127414  -0.8805597  0.6435158  0.9629489 
Xelaev15000007m  0.4012530  -0.8854113  0.6425895  0.9614517 

我有一個數據幀,有我想從這個大矩陣中提取的基因對。

 V1    V2 
1 Xelaev15011657m Xelaev15017932m 
2 Xelaev15011587m Xelaev15046612m 
3 Xelaev15011594m Xelaev15046616m 
4 Xelaev15011597m Xelaev15046617m 
5 Xelaev15011603m Xelaev15046624m 
6 Xelaev15011654m Xelaev15017928m 

(比較Xelaev15073085mXelaev15000002m當例如值0.1250128)我試圖遍歷該數據幀,並輸出一對matrix["gene1","gene2"]的基質細胞。在單個基因的基礎上做這件事很容易,但是我嘗試在for循環中爲這個列表中的成千上萬對執行此操作失敗。在下面的例子中,頭像列表是上面數據框的一個樣本,FullcorSM是完整的相關矩陣。

for(i in headedlist$V1){ 
    data.frame(i, headedlist[i,2], FullcorSM[i,headedlist[i,2]]) 
} 

上述行是我的第一次嘗試,並返回null。我的第二次嘗試如下所示。

for(i in 1:nrow(stagelist)){ 
    write.table(data.frame(stagelist$V1, stagelist$V2, FullcorSM["stagelist$V1","stagelist$V2"]), 
       file="sampleout", 
       sep="\t",quote=F) 
} 

其中返回超出界限的錯誤。要做FullcorSM["stagelist$V1", "stagelist$V2"]部分沒有引號的第二個例子,返回第一列每列的第二列的所有值,更接近我想要的,但仍缺少關於R如何解釋我的矩陣/數據幀語法的一些知識,但我不清楚該修復是什麼。有關如何進行的任何見解?

+0

我懷疑'匹配'和矩陣索引可以讓你做到這一點只需幾行,沒有循環。儘管沒有[可重現的例子](http://stackoverflow.com/q/5963269/210673),但很難編寫代碼來提供幫助。 – Aaron

+0

關於矩陣的好處:你實際上只需要做'FullcorSM [as.matrix(headslist)]',你就可以得到一個向量值。 (*只要*,即頭列表中的所有值實際上都以矩陣中的列和/或行名顯示)。 –

+1

還要注意,你的第一次嘗試只返回NULL的原因是因爲你實際上並沒有在循環中選擇每個值。孤立中的'for'循環只是函數(就像R中的大多數其他事物一樣),而'NULL'是默認的返回值。這取決於你將價值分配給某些東西以保存它們。否則,R將簡單地查看每個值,並說「是的,它在那裏!」並繼續前進。 – joran

回答

5

您嘗試創建的功能實際上內置於R.您可以使用另一個兩列矩陣從矩陣中提取值,其中第一列代表rownames,第二列代表列名稱。例如:

m = as.matrix(read.table(text="    Xelaev15073085m Xelaev15073088m Xelaev15073090m Xelaev15073095m 
Xelaev15000002m  0.1250128  -0.6368677  0.3119062  0.3980826 
Xelaev15000006m  0.4127414  -0.8805597  0.6435158  0.9629489 
Xelaev15000007m  0.4012530  -0.8854113  0.6425895  0.9614517")) 

# note that your subscript matrix has to be a matrix too, not a data frame 
n = as.matrix(read.table(text="Xelaev15000002m Xelaev15073088m 
Xelaev15000006m Xelaev15073090m")) 

# then it's quite simple 
print(m[n]) 
# [1] -0.6368677 0.6435158 
+0

不錯。出於某種原因,我認爲矩陣索引只適用於數字索引,而不是字符,這會使匹配成爲必要。可能不會! – Aaron

+0

+1!你應該注意,如果你嘗試使用原始矩陣中不存在的值進行子集化(如OP示例中所示),則會出現錯誤'下標越界'。 – agstudy

+0

+1!一個愚蠢的問題也許......在哪裏是行名,哪些是m中的列名?即它會在「相同」的相關矩陣上工作,但碰巧發生了轉置? – Henrik

1

遠不如@David Robinson那樣乾淨的解決方案。無論如何,在相關矩陣中哪些基因在行中,哪些在列中,以及下標矩陣是否包含不在相關矩陣中的組合並不重要。相同的矩陣名稱作爲@大衛的解決方案:

# combinations of row and column names for original and transposed correlation matrix 
m_comb <- c(outer(rownames(m), colnames(m), paste), 
      outer(rownames(t(m)), colnames(t(m)), paste)) 

# 'dim names' in subscript matrix 
n_comb <- paste(n[, "V1"], n[, "V2"]) 

# subset 
m[n[n_comb %in% m_comb, ]] 
# [1] -0.6368677 0.6435158 

更新

另一種可能,稍微令人費解,但也許更有用的輸出。首先將相關矩陣讀取到數據幀df,並將下標矩陣讀取到數據幀df2

# add row names as a column in correlation matrix 
df$rows <- rownames(df) 

# melt the correlation matrix 
library(reshape2) 
df3 <- melt(df) 

# merge subscript data and correlation data 
df4 <- merge(x = df2, y = df3, by.x = c("V1", "V2"), by.y = c("rows", "variable")) 
df4 
#    V1    V2  value 
# 1 Xelaev15000002m Xelaev15073088m -0.6368677 
# 2 Xelaev15000006m Xelaev15073090m 0.6435158