2011-09-09 98 views
1

我正在搜索幾個大型文件的複製基因條目。在我的基因列表中有幾個重複和至少一個triplcate條目。我只是想能夠找出哪些線代表'!'!For循環和如果條件語句不給予T/F

我得到的錯誤:

Error in if (genes[i, 1] == genes[j, 1] && i != j) { : 
missing value where TRUE/FALSE needed 

我在一個路障。

genes <- combine[c(4)] 
num_rows <- nrow(genes) 
dup_combine <- vector(mode="character", length=100) 
n=1 
for (i in 1:num_rows) { 
only_check_rows <- num_rows-1 
    for (j in i+1:only_check_rows) { 
     if (genes[i,1] == genes[j,1]&&i!=j) { 
     dup_combine[n] <- combine[i,1] 
     n=n+1 
     cat("i=",i,"j=",j,"\n") 
     } 
    } 
} 
+4

什麼'duplicated'? – Aaron

+0

亞倫,我會看看'重複',謝謝你的提示。 – oaxacamatt

+0

我真的很喜歡'重複'的命令,但它並不告訴我什麼是重複的,以及哪裏是dups?有什麼建議麼? – oaxacamatt

回答

4

它看起來像你正在尋找重複在一個載體(genes)。有幾種方法可以做到這一點。下面是一些示例數據:

dat <- c(1,2,3,2,4,4,6,NA,8,NA,13) 

table將計數dat每個唯一值的出現次數的數量。請注意我用exclude = NULL迫使它來計算NA值以及:

table(dat, exclude = NULL) 

正如在評論中提到,duplicated也適用。該函數返回一個布爾向量,明確指出哪些條目與之前的條目重複。 fromLast = TRUE告訴它從後到前看,而不是從前到後看。

duplicated(dat) 
duplicated(dat, fromLast = TRUE) 

您可以在這兩個方向結合起來,得到所有重複的元素:

subset(dat, duplicated(dat) | duplicated(dat, fromLast = TRUE)) 

如果您正在使用的數據幀,而不是單一的載體工作,duplicated可能是要走的路。

編輯

下面是一個使用樣本數據幀短樣例:

dat <- data.frame(x = c(1,2,3,4,4,5,6,5,9), 
     y = c(2,3,1,2,2,6,2,6,10)) 
> dat 
    x y 
1 1 2 
2 2 3 
3 3 1 
4 4 2 
5 4 2 
6 5 6 
7 6 2 
8 5 6 
9 9 10 

#Boolean vector of duplicated rows 
duplicated(dat) 
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE TRUE FALSE 

#Indices of duplicated rows 
which(duplicated(dat)) 
[1] 5 8 

#Look in both directions to get all dups (indices) 
which(duplicated(dat) | duplicated(dat,fromLast = TRUE)) 
[1] 4 5 6 8 

#The actual rows 
subset(dat,duplicated(dat) | duplicated(dat, fromLast = TRUE)) 
    x y 
4 4 2 
5 4 2 
6 5 6 
8 5 6 

+0

如果我理解這個(有趣)的例子,那麼輸出將不會給我複製品的名稱和位置。真的嗎? – oaxacamatt

+1

@oaxacamatt'duplicated'返回一個布爾向量,這很有用,因爲它更通用於你後面的特定信息。將它包裝在'which(...)'得到索引或rownames [duplicate(...)]'(data frame)'names [duplicated(...)]'(named vector)以獲得行/元素名稱。 – joran

1

錯誤 「缺失值,其中TRUE/FALSE需要」 如果你給ifNA發生。我懷疑要麼

genes[i,1] 

genes[j,1] 

NA,即genes在它有一些NA秒。如果你想測試中可能有NA平等,你可以使用

identical(genes[i,1], genes[j,1]) 
0

我在這裏的猜測是,你有你的數據缺失值。 genes[i, 1]genes[j, 1]正在返回null或NA。在失敗之後,找出i和j的值,然後查看該行。我懷疑你能夠回到什麼是錯的。

+0

好主意,謝謝,只是檢查,沒有找到任何。 – oaxacamatt

+0

你在基因[i,1]和基因[j,1]的基礎上得到了什麼? –

+0

JD,我怎麼知道break pt在哪裏?什麼命令? – oaxacamatt

1

由於@joran寫,你應該使用複製。但是,你的代碼的問題是由於錯誤的索引...

當指數在陣列外,你NA回來...

像這樣的東西應該更好地工作:

for(i in seq_len(num_rows-1)) { 
    for(j in (i+1):num_rows) { 
    ... 
+0

很好找到OP的代碼。我敢打賭,我們大多數人(包括我自己)都沒有仔細閱讀。 – Aaron