简体   繁体   English

在R中用cbind组合相同大小的行

[英]Combine rows of same size by cbind in R

I would like to rearrange the matrix b in the following way: 我想以下列方式重新排列矩阵b:

> b <- matrix(1:24, 6, 4)
> b
      [,1] [,2] [,3] [,4]
[1,]    1    7   13   19
[2,]    2    8   14   20
[3,]    3    9   15   21
[4,]    4   10   16   22
[5,]    5   11   17   23
[6,]    6   12   18   24

> cbind(b[1:2, ], b[3:4, ], b[5:6, ])
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    7   13   19    3    9   15   21    5    11    17    23
[2,]    2    8   14   20    4   10   16   22    6    12    18    24

The number of rows (2 here) is always going to be the same but the matrix b is going to be very large, on the dimension of about 1M x 100. Is there some fast way I can do this without a for loop? 行数(此处为2)总是相同,但矩阵b将非常大,大小约为1M x 100.有没有一些快速的方法我可以在没有for循环的情况下做到这一点? Thanks. 谢谢。

First, split b into chunks of two rows using lapply and then cbind the subgroups together using do.call . 首先,使用lapplyb拆分成两行的块,然后使用do.call将子组cbind在一起。

do.call(cbind, lapply(seq(1, NROW(b), 2), function(i) b[i:(i+1),]))
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#[1,]    1    7   13   19    3    9   15   21    5    11    17    23
#[2,]    2    8   14   20    4   10   16   22    6    12    18    24

Another way is to separate elements of odd and even rows into two vectors and rbind them 另一种方法是将奇数行和偶数行的元素分成两个向量并对其进行rbind

rbind(do.call(c, data.frame(t(b[(1:NROW(b) %% 2) == 1,]))),
      do.call(c, data.frame(t(b[(1:NROW(b) %% 2) == 0,]))))
#     X11 X12 X13 X14 X21 X22 X23 X24 X31 X32 X33 X34
#[1,]   1   7  13  19   3   9  15  21   5  11  17  23
#[2,]   2   8  14  20   4  10  16  22   6  12  18  24

Yet another way which is, for the most part, similar to the second approach 另一种方式在很大程度上类似于第二种方法

do.call(rbind, lapply(split(data.frame(b), 1:2), function(x) do.call(c, data.frame(t(x)))))
#  X11 X12 X13 X14 X31 X32 X33 X34 X51 X52 X53 X54
#1   1   7  13  19   3   9  15  21   5  11  17  23
#2   2   8  14  20   4  10  16  22   6  12  18  24

You can reshape the array, transpose it with aperm and reshape it again: 你可以重塑数组,用aperm转置它并重新aperm

array(aperm(array(b, c(2,3,4)), c(1,3,2)), c(2,12))

#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#[1,]    1    7   13   19    3    9   15   21    5    11    17    23
#[2,]    2    8   14   20    4   10   16   22    6    12    18    24

Another option: 另外一个选项:

tb <- t(b)
rbind(c(tb[,c(T,F)]), c(tb[,c(F,T)]))
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
#[1,]    1    7   13   19    3    9   15   21    5    11    17    23
#[2,]    2    8   14   20    4   10   16   22    6    12    18    24

Step one, reshape it to 2, 3, 4 : 第一步,重塑为2, 3, 4

array(b, c(2,3,4))
, , 1

     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    2    4    6

, , 2

     [,1] [,2] [,3]
[1,]    7    9   11
[2,]    8   10   12

, , 3

     [,1] [,2] [,3]
[1,]   13   15   17
[2,]   14   16   18

, , 4

     [,1] [,2] [,3]
[1,]   19   21   23
[2,]   20   22   24

Step two, switch axis/transpose 2 and 3: 第二步,切换轴/转置2和3:

aperm(array(b, c(2,3,4)), c(1,3,2))

, , 1

     [,1] [,2] [,3] [,4]
[1,]    1    7   13   19
[2,]    2    8   14   20

, , 2

     [,1] [,2] [,3] [,4]
[1,]    3    9   15   21
[2,]    4   10   16   22

, , 3

     [,1] [,2] [,3] [,4]
[1,]    5   11   17   23
[2,]    6   12   18   24

Step three, reshape it to desired dimensions: 第三步,将其重塑为所需尺寸:

array(aperm(array(b, dim = c(2,3,4)), c(1,3,2)), dim = c(2,12))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
[1,]    1    7   13   19    3    9   15   21    5    11    17    23
[2,]    2    8   14   20    4   10   16   22    6    12    18    24

Using split to chunk the matrix, then loop to add dimensions and cbind : 使用split来块化矩阵,然后循环添加维度和cbind

# number of rows
n <- 2

do.call(cbind, lapply(split(b, (seq(nrow(b))-1) %/% n), matrix, nrow = n))

#      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# [1,]    1    7   13   19    3    9   15   21    5    11    17    23
# [2,]    2    8   14   20    4   10   16   22    6    12    18    24

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM