使用列

时间:2017-05-23 19:11:16

标签: r dataframe row

我有一个用于在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中进行这种操作吗?我很感激任何建议。

2 个答案:

答案 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))