我有一个矩阵,我想创建一个列表,其中列表元素的选定行。
例如,这是我的矩阵
my.matrix=matrix(1:100, nrow=20)
我希望从这个矩阵创建一个列表,使得这个列表的每个元素都是矩阵的一部分,每个部分的行索引由
定义my.n=c(1,2,4,3,5,5)
其中my.n
给出了应从my.matrix
中提取的行数。 my.n[1]=1
表示第1行; my.n[2]=2
表示第2,3行; my.n[3]=4
表示第4行到第7行,依此类推。
所以我的列表的第一个元素应该是
my.matrix[1,]
第二
my.matrix[2:3,]
等等。
如何以优雅的方式做到这一点?
答案 0 :(得分: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.matrix
的行号拆分为my.n
的复制。然后,我们在结果列表lapply()
上使用S
将子集my.matrix
与这些行号一起使用。
答案 1 :(得分:3)
end <- cumsum(my.n)
start <- c(1,(end+1)[-length(end)])
mapply(function(a,b) my.matrix[a:b,,drop=F], start, end)
mapply
从两个向量中获取第一个参数并将它们应用于函数。它移动到每个向量的第二个元素并继续通过每个向量。此行为适用于此应用程序创建所述子集列表。感谢@nongkrong采用mapply
方法。