我有一个矩阵,我想创建一个列表,其中该矩阵的选定行是列表元素。
例如,这是我的矩阵
my.matrix=matrix(1:100, nrow=20)
我想从这个矩阵中创建一个列表,这样列表中的每个元素都是矩阵的一部分,每个部分的行索引由定义
my.n=c(1,2,4,3,5,5)
其中CCD_ 1给出了应当从CCD_。CCD_ 3表示第1行;my.n[2]=2
表示第2,3行;my.n[3]=4
表示第4行至第7行,依此类推
所以我的列表的第一个元素应该是
my.matrix[1,]
第二
my.matrix[2:3,]
等等
如何以优雅的方式做到这一点?
不太确定,但我想你想要这样的东西。。。
S <- split(seq_len(nrow(my.matrix)), rep.int(seq_along(my.n), my.n))
lapply(S, function(x) my.matrix[x, , drop = FALSE])
在这里,我们通过复制my.n
来分割my.matrix
的行号。然后,我们在结果列表S
上使用lapply()
来用这些行号子集my.n
0。
end <- cumsum(my.n)
start <- c(1,(end+1)[-length(end)])
mapply(function(a,b) my.matrix[a:b,,drop=F], start, end)
mapply
从两个向量中获取第一个自变量,并将它们应用于一个函数。它继续移动到每个向量的第二个元素,并在每个向量中继续。此行为适用于此应用程序,以创建所述的子集列表。感谢@nongkron的mapply
方法。