如何将矩阵分割成许多子矩阵?每个子矩阵应包含初始矩阵的选择行。
初始矩阵是从.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位)。 (我不是以英语为母语的人 - 请原谅缺乏口才)
答案 0 :(得分:1)
seri
在这里看起来不像是一个列表。实际上,A
或B
都没有。你确定你在谈论名单吗?看起来更像是想要多次对矩阵进行子集化,从而创建子矩阵。我无法想象你真的想要&#34;随机&#34;名字,或者。那个疯狂的谈话。
如果要拆分矩阵,为什么不将所有生成的矩阵存储在实际列表中?
myList <- list()
myList[[1]] <- seri[a:b,]
myList[[2]] <- seri[c:d,]
你可以看到将它放入循环中是多么容易。现在myList
是一个矩阵列表,例如,mylist[[i]]
将是第i个矩阵。如果您想要第二行和第三列条目,那么它将是mylist[[i]][2,3]
。