2012-01-25 11 views
1

私はEntrez ID(整数ベクトル)の複数のベクトルをReduce(交差、...)を使って比較しようとします。ベクトルは「DISTINCT」を使用してデータベースから選択され、単一ベクトルに重複が含まれないようにします。私はベクトルとファクターに対する交差の動作が異なります

length(Reduce(intersect,list(c(l1$entrez),c(l2$entrez),c(l3$entrez),c(l4$entrez)))) 

又は

length(Reduce(intersect,list(c(factor(l1$entrez)),c(factor(l2$entrez)),c(factor(l3$entrez)),c(factor(l4$entrez))))) 
で複数のベクトルを比較すると

length(factor(c(l1$entrez))) 

length(c(l1$entrez)) 

同じ長さ(同じIDをW/Oの長さの関数)を与えます

結果は同じではありません。私はその要因を知っています!= originalVectorしかし、最初の要因/ベクトルの長さとレベルは同じですが、なぜ結果が異なるのか理解できません。

誰かがvectorやfactorのintersect関数の異なる動作を説明できますか? 2つの要素リストの交点が再び要因リストであり、重複が異なる方法で扱われるのでしょうか?

編集 - 例:

> head(l1) 
    entrez 
1  1 
2 503538 
3 29974 
4 87769 
5  2 
6 144568 

> head(l2) 
entrez 
1 1743 
2 1188 
3 8915 
4 7412 
5 51082 
6 5538 

リストは、約500のEntrez IDが20Kに含まれています。したがって、ベクトルは純粋な整数を含み、テストされたすべてのベクトルの間に交点を与える必要があります。

> length(Reduce(intersect,list(c(factor(l1$entrez)),c(factor(l2$entrez)),c(factor(l3$entrez)),c(factor(l4$entrez))))) 
[1] 514 
> length(Reduce(intersect,list(c(l1$entrez),c(l2$entrez),c(l3$entrez),c(l4$entrez)))) 
[1] 338 
> length(Reduce(intersect,list(l1$entrez,l2$entrez,l3$entrez,l4$entrez))) 
[1] 494 

私は深刻なことに謝罪しなければなりません。交差関数の異なる挙動は、データの問題によって引き起こされる可能性があります。コンマ区切りのEntrez ID(22038,23207、...)を含むデータセットのフィールドが見つかりました。私はデータをより詳細に見ていたはずです。答えと時間をありがとう。私はまだ異なる結果を理解していませんが、これが異なる行動の原因であると確信しています。誰かがそれを確認できますか?

+3

他の人に話すことはできませんが、再現可能な例は大いに役立ちます。 –

+0

コメントをいただきありがとうございます:比較しようとしているリストの例: –

+0

IDは因子か整数変数ですか?データベースからインポートした場合、そのデータベースはIDとして文字を格納します(数値演算が意味する変数ではないので妥当です)。 –

答えて

0

ローマンの言うとおり、例が非常に役立ちます。

しかし、1つの可能性は、変数l1$entrezl2$entrezなどが同じレベルであるが、異なる順序であることです。

intersectは、引数を文字変数に変換するas.vectorで引数を変換します。これは通常、適切なことです。さまざまなレベルの順序が結果に影響を与えないことを意味します。

intersectの引数としてfactor(l1$entrez)を渡すことで、レベルの順序がデフォルトに設定された新しい要素が効果的に作成されるため、さまざまなレベルの順序の影響が取り除かれます。しかし、c(l1$entrez)を渡した場合は、変数から因子属性を削除します。残っているものは、レベルの順序に依存する生の整数コードです。

例:

a <- factor(letters[1:3], levels=letters) 
b <- factor(letters[1:3], levels=rev(letters) 

# returns 1 2 3 
intersect(c(factor(a)), c(factor(b))) 

# returns integer(0) 
intersect(c(a), c(b)) 

私はあなたがここでc()を使うべき理由何らかの理由が表示されません。 Rがそれ自体で要素を処理するようにしましょう(ただし、公平であるために、ステップインしたい別のシナリオがあります)。

+0

ありがとうございました。あなたの答えは、すべての混乱を免れてくれませんが、とにかく多くの助けになります。他の混乱のレイヤーを追加するには、factor()またはc()を使用せずに、別の結果セット(3番目の結果)を与える交差を計算する3番目の方法を与えることができます:length(Reduce(intersect、list(l1 $ entrez、l2 $ entrezあなたがc()を使用しないことを提案した後でこれを試しました(これはもちろん完全に正しいです)。私はReduced()を使った例のためにc()を使いました。 –

関連する問題