【问题标题】:R_List from a selected rows of matrixR_List 来自选定的矩阵行
【发布时间】:2015-10-28 13:52:20
【问题描述】:

我有一个矩阵,我想创建一个列表,该矩阵的选定行是列表元素。

例如这是我的矩阵

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,]

等等。

如何优雅地做到这一点?

【问题讨论】:

    标签: r list matrix


    【解决方案1】:

    不太确定,但我想你想要这样的东西......

    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 的行号。然后我们使用 lapply() 在结果列表 S 上使用这些行号来子集 my.matrix

    【讨论】:

    • 谢谢。正是我想要的。
    【解决方案2】:
    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 方法。

    【讨论】:

    • 谢谢。我正在做类似的事情,几乎到了这一点。但我认为在@Richard Scriven 中的apply 函数之前使用split 是更优雅的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多