[英]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
. 首先,使用
lapply
将b
拆分成两行的块,然后使用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.