2012-05-08 10 views
1

私は、予測された手段とのペアワイズ比較のための重要度のマトリックスを生成する、私が継承したコードをいくつか持っています。モデルには複数のサイトや治療のデータが含まれていますが、サイト内の治療内の遺伝子型を比較したいだけなので、比較のサブセットのみが意味を持ちます。特定のペアごとの比較を行う方法R

ここには、現在生成されているもののダミーバージョンがあります。

effect.nam <- expand.grid(site=c("A","B","C"), treat=c("low","high"), genotype=c("A1","B2")) 
labels <- paste(effect.nam[,1],effect.nam[,2],effect.nam[,3], sep=".") 
mat <-matrix(sample(c(T,F),144,replace=T),12,12) 
dimnames(mat) <- list(labels,labels) 

T/Fは明らかにランダムです。私が望むのは、サイトと治療の比較だけを見ることです。自己比較も削除するといいでしょう。理想的には私は、フォームでのデータフレームを返したい:

Site Treat Genotype1 Genotype2 Sig 
1  A low   A1   2 TRUE 
2  A low   A1   3 TRUE 
3  A low   B2   3 TRUE 
4  A high   A1   2 TRUE 
5  A high   A1   3 FALSE 
6  A high   B2   3 FALSE 
7  B low   A1   2 FALSE 
8  B low   A1   3 TRUE 
9  B low   B2   3 FALSE 
10 B high   A1   2 TRUE 
11 B high   A1   3 TRUE 
12 B high   B2   3 TRUE 
13 C low   A1   2 TRUE 
14 C low   A1   3 TRUE 
15 C low   B2   3 FALSE 
16 C high   A1   2 TRUE 
17 C high   B1   3 TRUE 
18 C high   A2   3 TRUE 

私はいくつかの偽の開始を作った、と誰もが正しい方向にいくつかの簡単なポインタを持っていた場合、それが認識されるであろう。

Chaseが下で示した非常に有用な答えでは、無意味な比較は取り除かれていますが、各有用な比較は2回(遺伝子型1対遺伝子型2およびその逆)含まれています。私は私の謝罪...彼らは本当に複製じゃないので、簡単に、これらを削除する方法

--Update--

を見ることができない、私は、チェイスのソリューションが実装されたときにそのようmatを変更するために必要なGenotype1Genotype2factorで、実際の状況と同様にintではありません。ここでは、比較の倍増を避けるために並べ替えの列を追加して、以下のソリューションにいくつか追加しました。

これはうまくいきますが、これらの列を追加することは私にとっては厄介なようです。よりエレガントな方法がありますか?

mat.m <- melt(mat) 
mat.m[,c("site1", "treat1", "genotype1")] <- colsplit(mat.m$X1, "\\.", c("site1", "treat1", "genotype1")) 
mat.m[,c("site2", "treat2", "genotype2")] <- colsplit(mat.m$X2, "\\.", c("site2", "treat2", "genotype2")) 
str(mat.m) 
mat.m$genotype1sort <- mat.m$genotype1 
mat.m$genotype2sort <- mat.m$genotype2 
levels(mat.m$genotype1sort) <- c(1, 2) 
levels(mat.m$genotype2sort) <- c(1, 2) 
mat.m$genotype1sort <- as.numeric(levels(mat.m$genotype1sort))[mat.m$genotype1sort] 
mat.m$genotype2sort <- as.numeric(levels(mat.m$genotype2sort))[mat.m$genotype2sort] 

subset(mat.m, site1 == site2 & treat1 == treat2 & genotype1 != genotype2 & genotype1sort < genotype2sort, 
    select = c("site1", "treat1", "genotype1", "genotype2", "value")) 

#----- 
    site1 treat1 genotype1 genotype2 value 
73  A low  A1  B2 TRUE 
86  B low  A1  B2 TRUE 
99  C low  A1  B2 TRUE 
112  A high  A1  B2 TRUE 
125  B high  A1  B2 FALSE 
138  C high  A1  B2 FALSE 
+0

パフォーマンスが問題になった場合、私は有用ではない多くの比較を実行する代わりに、必要な比較を生成し、そのリストを実際にポストダウンします。 – Chase

答えて

1

これは、reshape2からいくつかの機能を使いたいと思っています。まず、長い形式にmeltデータ:

require(reshape2) 
mat.m <- melt(mat) 
#-------- 
     X1  X2 value 
1 A.low.1 A.low.1 TRUE 
2 B.low.1 A.low.1 TRUE 

次は、上の3つの列に列X1とX2を分割しました「」あなたが欲しい順序で列を取得し、取得したい行をサブセット、

最後
> head(mat.m,3) 
     X1  X2 value site1 treat1 genotype1 site2 treat2 genotype2 
1 A.low.1 A.low.1 TRUE  A low   1  A low   1 
2 B.low.1 A.low.1 TRUE  B low   1  A low   1 
3 C.low.1 A.low.1 FALSE  C low   1  A low   1   

mat.m[,c("site1", "treat1", "genotype1")] <- colsplit(mat.m$X1, "\\.", c("site1", "treat1", "genotype1")) 
mat.m[,c("site2", "treat2", "genotype2")] <- colsplit(mat.m$X2, "\\.", c("site2", "treat2", "genotype2")) 

は今、mat.mは次のようになります。そこsubsetを超えてこれを行う方法はたくさんがありますが、私はここで明確にするためにそれを使用し、注意:

subset(mat.m, site1 == site2 & treat1 == treat2 & genotype1 != genotype2, 
     select = c("site1", "treat1", "genotype1", "genotype2", "value")) 
#-------- 
    site1 treat1 genotype1 genotype2 value 
7  A low   2   1 TRUE 
20  B low   2   1 TRUE 

あなたはおそらくより巧妙な何かをするとアウト2つの列を分割避けることができますが、これは何をしているようだあなた合理的にまっすぐに進むべきである。

+0

それは素晴らしいです、それは私にそこにほとんどすべての方法を取る。私はちょうどそれを適用し、それはうまく動作します。私はそこに行く途中であったと思いますが、あなたは私の人生を楽にしました。もし私が貪欲になることができれば、ダブルアップ比較(1対2対2対1)を除外したいと思います。どのような簡単なアイデアですか? – alexwhan

+0

@alexwhan - すごくうれしい、これは参考になる! 'genotype1'と' genotype2'の関係について考えてみましょう。現時点では、それは不等式、あるいは単に 'genotype1!= genotype2'と定義されています。あなたは2つの比較、すなわち「1対2」または「2対1」のうちの1つだけを得るように、その関係をどのように修正するでしょうか? – Chase

+0

すみません、私は頭を痛めて失敗しました。唯一の明白なことは>と思われますが、これは要因には意味がありません。私は数字に変換することができましたが、それは扱いにくいようです... – alexwhan

関連する問題