2017-04-15 70 views
0

我是相當新的R,所以我將不勝感激,如果有人可以幫助我:)搜索對R中

我有一個大的矩陣,例如: matrix 和基因的載體。 我的任務是逐行搜索矩陣,並將帶有突變的基因對(在矩陣上是D707H)與載體中包含的其餘基因進行編譯,並將其添加到新的矩陣中。我試着用循環做這件事,但我不知道如何正確書寫它。對於這個矩陣應該看某事像這樣:

PR.02.1431  
    NBN BRCA1 
    NBN BRCA2 
    NBN CHEK2 
    NBN ELAC2 
    NBN MSR1 
    NBN PARP1 
    NBN RNASEL 

現在我有某事像這樣: my idea

「a」是我最初的矩陣。

任何人都可以指向正確的方向嗎? :)

+0

請做一個可重現的例子。看到這個:http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example圖像不是解釋你需要什麼的最好方式。還包括所需的結果。 –

+0

使用'dplyr'包的'gather()'函數,並過濾一些內容。 – knb

+1

我相信你的意思是'tidyr'包。 – student

回答

0

也許你想要/需要的是which(..., arr.ind = TRUE)

一些示例數據,用於演示:

set.seed(2) 
n <- 10 
mtx <- array(NA, dim = c(n, n)) 
dimnames(mtx) <- list(letters[1:n], LETTERS[1:n]) 
mtx[sample(n*n, size = 4)] <- paste0("x", 1:4) 
mtx 
# A B C D E F G H I J 
# a NA NA NA NA NA NA NA NA NA NA 
# b NA NA NA NA NA NA NA NA NA NA 
# c NA NA NA NA NA NA NA NA NA NA 
# d NA NA NA NA NA NA NA NA NA NA 
# e NA NA NA NA NA NA NA NA NA NA 
# f NA NA NA NA NA NA NA NA NA NA 
# g NA "x4" NA NA NA "x3" NA NA NA NA 
# h NA NA NA NA NA NA NA NA NA NA 
# i NA "x1" NA NA NA NA NA NA NA NA 
# j NA NA NA NA NA NA "x2" NA NA NA 

在你的情況,似乎任何你想要的不是一個NANaN。你可以嘗試:

which(! is.na(mtx) & ! is.nan(mtx)) 
# [1] 17 19 57 70 

但這並不總是直覺檢索行/列對(基因,我想?)。嘗試改爲:

ind <- which(! is.na(mtx) & ! is.nan(mtx), arr.ind = TRUE) 
ind 
# row col 
# g 7 2 
# i 9 2 
# g 7 6 
# j 10 7 

如何使用它:整數分別是行和列索引。假設你的矩陣使用行名和列名,你可以檢索該行的名稱:(聰明的讀者可能會建議我用rownames(ind)相反,它肯定有效!)

rownames(mtx)[ ind[,"row"] ] 
# [1] "g" "i" "g" "j" 

同樣爲colnames"col"

有趣的是,即使ind是矩陣本身,你可以用子集mtx相當容易:

mtx[ind] 
# [1] "x4" "x1" "x3" "x2" 

結合所有三個人在一起,你也許可以使用:

data.frame(
    gene1 = rownames(mtx)[ ind[,"row"] ], 
    gene2 = colnames(mtx)[ ind[,"col"] ], 
    val = mtx[ind] 
) 
# gene1 gene2 val 
# 1  g  B x4 
# 2  i  B x1 
# 3  g  F x3 
# 4  j  G x2 
+0

我試過這種方法,但沒有效果......我有一個錯誤: _default方法沒有實現類型'list'_你知道該怎麼處理它嗎? –

+0

顯然你的矩陣不是矩陣。沒有看到更多的數據,我不禁要看屏幕截圖。 – r2evans

+0

使用_which_函數後出現。 –

0

我知道我的錯誤在哪裏,現在我有矩陣。分析你的代碼很有效,但這不完全是我想要做的。 a,b,c,d等是有機體,排名是基因(A,B,C,D等)。我必須將一對基因(在同一列中)與NA值相比較。

gene1 gene2 
a A  B 
a A  C 
a A  D 
a A  E 

我試圖以這種方式,但元素數量不匹配,我不知道如何解決這個問題:例如,如果基因一個我必須有值= 4。

ind= which(! is.na(a) & ! is.nan(a), arr.ind = TRUE) 
ind1=which(macierz==1,arr.ind = TRUE) 
ramka= data.frame(
    kolumna = rownames(a)[ ind[,"row"] ], 
    gene1 = colnames(a)[ ind[,"col"] ], 
    gene2 = colnames(a)[ind1[,"col"]], 
    #val = macierz[ind] 
) 

你知道如何在R中做到這一點嗎?

+0

這真的不是一個答案,它似乎是對你的問題的澄清(或補充)。如果是這樣,請把它放在那裏(並刪除這個答案)。如果我誤解了這一點,並且已經用此代碼解決了問題,那麼您可以自己「接受」自己的答案。 – r2evans