R:将一个矩阵拆分成许多矩阵

时间:2014-08-16 18:39:13

标签: r list

如何将矩阵分割成许多子矩阵?每个子矩阵应包含初始矩阵的选择行。

初始矩阵是从.csv文件中导入的:

seri <- read.table("/PATH/seriation_testdaten.csv", sep="\t", head=TRUE, row.names=1)

此矩阵系列包含数值,例如像seritest这样的矩阵:

seritest <- matrix(1:100,10)

现在我想把这个矩阵的行分成几组。例如,我希望每个组都有三行。因此,一组应包含行1,2和3,下一行应包含行4,5和6,依此类推,直到达到nrow(seri)。如果最后一组只包含少于三行,那就没问题了。

Matrix 1:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,]    1   11   21   31   41   51   61   71   81    91
[2,]    2   12   22   32   42   52   62   72   82    92 
[3,]    3   13   23   33   43   53   63   73   83    93

Matrix 2:

     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[4,]    4   14   24   34   44   54   64   74   84    94
[5,]    5   15   25   35   45   55   65   75   85    95
[6,]    6   16   26   36   46   56   66   76   86    96

Matrix 3:

...

这是第一步。但我想更进一步。在这个例子中,我在结果子矩阵中有三行组。但我也希望得到的子矩阵为1行,2行,4行,5行等组,直到nrow(seri)行。所以基本上是数百个子矩阵,它们都是基于决定组大小应该是多大的单元的一部分。

感谢@farnsy的帮助,我能够生成正常工作的代码:

seritest <- matrix(1:10000,100)

a = nrow(seritest)
e = 1:nrow(seritest)

seri_sub <- list()
U=1
while(U<=a) {
  Q=0
  AQ=0
  EQ=0
  Uk <- U*1000;
  repeat{
    (e[U]*Q)+1 -> EQ;
    Q=Q+1;
    e[U]*Q -> AQ;
    if(AQ>a) break
    seri_sub[[Uk+Q]] <- seritest[EQ:AQ,];
  };
  U=U+1;
}

我可以通过调用例如seri_sub [[3002]]来访问矩阵。像这样,我得到了第二个(300 ** 2 **)组(第4,5和6行),这是将初始矩阵划分为三个组(** 3 ** 002)的结果。

就像@Dason已经提到的那样,这段代码效率很低。许多list-elements为空(NULL)。也许有人知道如何改进它。

此代码在没有任何其他包的情况下运行。 R版本3.0.2(2013-09-25)。操作系统:Ubuntu 14.04(64位)。 (我不是以英语为母语的人 - 请原谅缺乏口才)

1 个答案:

答案 0 :(得分:1)

seri在这里看起来不像是一个列表。实际上,AB都没有。你确定你在谈论名单吗?看起来更像是想要多次对矩阵进行子集化,从而创建子矩阵。我无法想象你真的想要&#34;随机&#34;名字,或者。那个疯狂的谈话。

如果要拆分矩阵,为什么不将所有生成的矩阵存储在实际列表中?

myList <- list()
myList[[1]] <- seri[a:b,]
myList[[2]] <- seri[c:d,]

你可以看到将它放入循环中是多么容易。现在myList是一个矩阵列表,例如,mylist[[i]]将是第i个矩阵。如果您想要第二行和第三列条目,那么它将是mylist[[i]][2,3]