【问题标题】:Split matrix and rejoin拆分矩阵并重新加入
【发布时间】:2010-11-26 14:41:29
【问题描述】:

这是我的第一篇文章。如果我的问题很愚蠢,请提前道歉。我是编程新手。

好的,所以我在 R 中有一个 matrix(eBpvalues),它有 152720 行和 2 列。 我想分成 10 个单独的矩阵,每个矩阵包含 15272 行。

我已经尝试过:

> newmx <-split(as.data.frame(eBpvalues), rep(1:10, each = 15272)))

> summary(newmx)  

   Length Class      Mode  
1  2      data.frame list    
2  2      data.frame list  
3  2      data.frame list  
4  2      data.frame list  
5  2      data.frame list  
6  2      data.frame list  
7  2      data.frame list  
8  2      data.frame list  
9  2      data.frame list  
10 2      data.frame list  

我将如何将这些矩阵并排连接,这样我就有了一个包含 20 列和 15272 行的新矩阵?

干杯,

尼尔

【问题讨论】:

  • @user521469 :正如 Gavin 向您展示的那样,您应该在问题中包含一个可重现的示例。这样我们就不必猜测您的数据是什么样子了。

标签: r matrix split


【解决方案1】:

你快到了。在这些情况下经常使用的函数是do.call,它采用您要应用的函数和要应用它的数据列表。您要应用的函数是 cbindcolumn 将 10 个数据框/矩阵绑定在一起。

从字面上看,我们从一个大小合适的矩阵mat(你的Q中的eBpvalues)开始。转换为数据框:

mat <- matrix(rnorm(152720 * 2), ncol = 2)
df <- data.frame(mat)

产生指标因子的一种简单方法是通过gl() 函数:

ind <- gl(10, 15272)

那么我们有你的split() 电话:

newMat <- split(df, ind)

最后一步是这个,我们do.call()cbind() 应用于newMat 中的数据框集:

res <- do.call(cbind, newMat)

这为我们提供了您想要的(尽管您可能需要整理列名等)。

> str(res)
'data.frame':   15272 obs. of  20 variables:
 $ 1.X1 : num  -0.268 -0.8568 -0.0267 1.0894 1.5847 ...
 $ 1.X2 : num  0.71 -0.298 0.359 0.97 -2.158 ...
 $ 2.X1 : num  -0.987 -0.222 2.991 0.443 0.228 ...
 $ 2.X2 : num  -2.343 -1.023 -1.48 1.47 0.758 ...
 $ 3.X1 : num  -0.305 -0.761 0.817 1.347 0.694 ...
 $ 3.X2 : num  -0.0915 0.4816 1.4662 -1.2668 -1.3523 ...
 $ 4.X1 : num  -0.678 -1.056 1.029 -0.468 0.836 ...
 $ 4.X2 : num  -0.656 -0.459 -0.965 -1.666 0.877 ...
 $ 5.X1 : num  -0.295 -1.255 1.395 -1.985 -1.71 ...
 $ 5.X2 : num  1.141 1.177 -1.003 -0.29 -0.234 ...
 $ 6.X1 : num  -0.0548 1.8673 -1.5388 -1.1063 0.3923 ...
 $ 6.X2 : num  -1.399 0.57 0.367 -0.811 -2.434 ...
 $ 7.X1 : num  0.389 -1.058 0.61 1.102 -0.063 ...
 $ 7.X2 : num  0.854 1.251 1.095 -0.485 0.451 ...
 $ 8.X1 : num  -2.018 0.849 0.3 0.988 -1.993 ...
 $ 8.X2 : num  -1.23 -1.025 -0.546 1.674 0.588 ...
 $ 9.X1 : num  0.814 0.726 1.04 0.985 1.781 ...
 $ 9.X2 : num  -1.094 -1.051 0.749 1.426 0.402 ...
 $ 10.X1: num  0.3786 1.6131 -0.4149 0.0684 -0.815 ...
 $ 10.X2: num  0.383 -0.136 -0.751 -0.164 0.434 ...

【讨论】:

  • 成功了!非常感谢。一段时间以来一直在努力解决这个问题。
  • 感谢 gl() 的指针。我一直忘记那个功能。
【解决方案2】:

使用索引,您可以在不使用 split 命令的情况下轻松做到这一点,因为 R 会按列填充矩阵。

一个玩具例子:

> eBpvalues <- matrix(1:100,ncol=2) # a matrix with 2 cols and 50 values
> id <- c(1,11)+rep(0:9,each=2)
> id
 [1]  1 11  2 12  3 13  4 14  5 15  6 16  7 17  8 18  9 19 10 20
> tt <- matrix(eBpvalues,ncol=20)[,id]
> tt # a matrix with the 2 cols split up and binded rowwise
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] [,19] [,20]
[1,]    1   51    6   56   11   61   16   66   21    71    26    76    31    81    36    86    41    91    46    96
[2,]    2   52    7   57   12   62   17   67   22    72    27    77    32    82    37    87    42    92    47    97
[3,]    3   53    8   58   13   63   18   68   23    73    28    78    33    83    38    88    43    93    48    98
[4,]    4   54    9   59   14   64   19   69   24    74    29    79    34    84    39    89    44    94    49    99
[5,]    5   55   10   60   15   65   20   70   25    75    30    80    35    85    40    90    45    95    50   100

这又给你一个矩阵。如果你使用 split,你可以使用 Gavin 的解决方案。这会将所有内容转换为数据帧,这可能会产生不必要的副作用。一开始在大型矩阵上要慢一些。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-22
    • 1970-01-01
    • 2015-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-02
    相关资源
    最近更新 更多