1

予測された平均値からペアワイズ比較の有意水準の行列を生成する、継承したコードがいくつかあります。モデルには複数のサイトと治療からのデータが含まれていますが、サイト内の治療内の遺伝子型のみを比較したいので、比較のサブセットのみが意味を持ちます.

これは、現在生成されているもののダミー バージョンです。

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 およびその逆)。これらは実際には重複していないため、これらを簡単に削除する方法がわかりません...

- アップデート -

申し訳ありませんがmat、Chase のソリューションが実装されたときに、私の実際の状況のように、ではなく、 になるように変更する必要がありました。以下のソリューションにいくつかの追加を行いました.Genotype1Genotype2factorint

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

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
4

1 に答える 1

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

次に、列 X1 と X2 を "." で 3 つの列に分割します。

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次のようになります。

> 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         

最後に、取得する行をサブセット化し、必要な順序で列を取得します。以外にもこれを行う方法はたくさんありますが、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 つの列を分割しないようにすることもできますが、これは目的どおりに動作するようで、かなり簡単です。

于 2012-05-08T04:41:00.717 に答える