2017-05-23 7 views
1

私はBayenvで共分散行列を作成するために使用していたSNPSファイルを持っています。このファイルの各列は集団に対応し、行はSNPですが、SNPごとに2つの対立遺伝子(2 * nsnps "行" とnpops "列")以下のようになります。列を偶数行に置き換えます

7  2  2  0  6  2  2 
1  0  0  0  0  0  0 
0  2  2  0  0  0  0 
1  0  0  0  0  0  0 

したがって、この例では、私は7つの集団(列)と2個のSNP(行)を持っている上に。このファイルの形式を少し変更する必要があります。新しいファイルでは、各行は1つのSNPに対応し、列の数は各対立遺伝子に対応するので、集団の数の2倍にする必要があります。だから、新しいファイルは次のように(nsnps「行」と2 * npops「列を」)になります。

7 1 2 0 2 0 0 0 6 0 2 0 2 0 
0 1 2 0 2 0 0 0 0 0 0 0 0 0 

私はRでこの操作を行うことができます方法はありますか?私はどんな提案も感謝します。

+0

は、データフレームということですか? – Sotos

+0

はい、それはデータフレームです – Anna1364

答えて

1

x <- split(mydf, rep(1:(nrow(mydf)/2),each=2)) 

t(sapply(x, function(x) matrix(as.matrix(x)))) 

ができます:

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] 
1 7 1 2 0 2 0 0 0 6  0  2  0  2  0 
2 0 1 2 0 2 0 0 0 0  0  0  0  0  0 

あなたはまた、行うことができます。

x <- split(mydf, rep(1:(nrow(mydf)/2),each=2)) 
newdf <- do.call(rbind.data.frame, lapply(x, function(x) matrix(as.matrix(x), nrow = 1))) 

とデータフレーム取り戻す:

> newdf 
    V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 
1 7 1 2 0 2 0 0 0 6 0 2 0 2 0 
2 0 1 2 0 2 0 0 0 0 0 0 0 0 0 
> class(newdf) 
[1] "data.frame" 

使用するデータ:

mydf <- structure(list(V1 = c(7L, 1L, 0L, 1L), V2 = c(2L, 0L, 2L, 0L), V3 = c(2L, 0L, 2L, 0L), V4 = c(0L, 0L, 0L, 0L), V5 = c(6L, 0L, 0L, 0L), V6 = c(2L, 0L, 0L, 0L), V7 = c(2L, 0L, 0L, 0L)), 
        .Names = c("V1", "V2", "V3", "V4", "V5", "V6", "V7"), class = "data.frame", row.names = c(NA, -4L)) 
+0

多くのありがとうJaap、まさに私が欲しいものです。完璧に動作します。 – Anna1364

1

基本的にデータをサブセット化し、偶数番号の行のみを取得する場合は、次の操作を実行できます。データが行列mに格納されていると仮定します。ここでは、seq()関数を使用して行列をインデックスする行インデックスを表す数列を生成して行を選択します。これはdata.framesでも同様に機能します。使用

> m <- matrix(c(1:33), nrow = 11, ncol = 3, byrow = TRUE) 
> m 
     [,1] [,2] [,3] 
[1,] 1 2 3 
[2,] 4 5 6 
[3,] 7 8 9 
[4,] 10 11 12 
[5,] 13 14 15 
[6,] 16 17 18 
[7,] 19 20 21 
[8,] 22 23 24 
[9,] 25 26 27 
[10,] 28 29 30 
[11,] 31 32 33 
> m[seq(from=2, to=nrow(m), by=2),] 
    [,1] [,2] [,3] 
[1,] 4 5 6 
[2,] 10 11 12 
[3,] 16 17 18 
[4,] 22 23 24 
[5,] 28 29 30 
関連する問題