2017-05-23 22 views
1

我有一個SNPSfile用於在Bayenv中創建協方差矩陣,因此該文件中的每個列對應的總體數和行數都是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(行)。我需要修改這個文件的格式。在新文件中,每行應該對應一個SNP,並且列的數量應該是總體數量的兩倍,因爲每對數字對應於每個等位基因。因此,新的文件應該是這樣的(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