r - 在 R 中通过 cbind 合并相同大小的行

标签 r matrix cbind

我想按以下方式重新排列矩阵 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

行数(此处为 2)始终相同,但矩阵 b 将非常大,尺寸约为 1M x 100。有没有一些快速的方法可以不用 for环形?谢谢。

最佳答案

首先,使用 lapplyb 分成两行的 block ,然后使用 do.callcbind 在一起.

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

另一种方法是将奇数行和偶数行的元素分成两个向量并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

还有一种方法,在很大程度上与第二种方法类似

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

关于r - 在 R 中通过 cbind 合并相同大小的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45200627/

相关文章:

R corrplot 颜色范围

r - R Commander 中 S_Dbw 输出中的 "Inf"是什么意思?

python - OpenGL获取投影矩阵

r - 按名称在 R 中 cbind 命名向量

R C5.0 获取每片叶子的规则和概率

r - C50 在 r 中失败,错误为 "c50 code called exit with value 1"

r - 在线性模型中结合 cbind 和 paste

r - 在第一个数据帧中创建一个新列,其中包含另一个数据帧中行的转置值和重复值

c - 从函数返回矩阵

python - numpy.linalg.inv() 是否给出了正确的矩阵逆?编辑: Why does inv() gives numerical errors?