2011-09-09 5 views
1

私はいくつかの大きなファイルを検索して、複製遺伝子のエントリを探しています。私の遺伝子リストには、いくつかの複製物と少なくとも1つのtriplateエントリーがあります。私はちょうどどの行が担当者であるかを知ることができるようにしたい!ForループとIf条件文が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

Aaron、私は '重複している'、先端のおかげで調べます。 – oaxacamatt

+0

私は 'duplicated'コマンドが本当に好きですが、複製されているものとdupsはどこにあるのですか?助言がありますか? – oaxacamatt

答えて

4

1つのベクトル(genes)で重複を検索しているようです。これを行うにはいくつかの方法があります。ここではいくつかのサンプルデータです:

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

tabledatにそれぞれユニークな値の出現箇所の数をカウントします。私もNA値をカウントすることを強制するためにexclude = NULLを使用注意:

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'はブール値ベクトルを返します。これはあなたが後にしている特定の情報よりも一般的なので便利です。行を取得するために、 ''(...) '(' rownames [duplicated(...]) '(データフレーム)'名前[duplicated(...)] '(名前付きベクトル)要素名。 – joran

1

あなたがifNAを与えた場合に起こるエラー "TRUE/FALSEが必要欠損値"。私はどちらか疑う

genes[i,1] 

または

genes[j,1] 

、すなわちgenesはそれにいくつかNA秒を持っている、NAです。あなたはNAがあるかもしれません平等をテストしたい場合は、あなたが

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

を使用することができ、ここで私の推測では、あなたのデータで欠損値を持っていることです。 genes[i, 1]またはgenes[j, 1]のいずれかがヌルまたはNAを返しています。それが失敗した直後に、iとjの値が何であるか把握し、その行を見てください。私はあなたが何が間違っているかに戻ることができると思う。

+0

良いアイデア、ありがとう、ちょうどチェックし、何も見つかりませんでした。 – oaxacamatt

+0

遺伝子が破壊された時点で遺伝子[i、1]と遺伝子[j、1]はどうなるのですか? –

+0

JD、ブレークポイントはどこにありますか?どのようなコマンドですか? – oaxacamatt

1

@joranが書いたように、あなたが複製を使用する必要があります。しかし、あなたのコードの問題は、誤ったインデックスのためです...

索引アレイの外側に、あなたが戻ってNAを取得...このような

何かがよりよく動作するはず:

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

OPのコードでニースが見つかりました。私は私を含めて私たちのほとんどがそれをよく読んでいないと思う。 – Aaron