我有一个用于在Bayenv中创建协方差矩阵的SNPS文件,因此该文件中的每一列对应于种群,行是SNP,但对于每个SNP,我有2行(对于两个等位基因),如下所示(2) * nsnps" rows"和npops" columns"):
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" rows"和2 * npops" columns"):
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 :(得分: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
答案 1 :(得分: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))