【问题标题】:List of Lists of matrices矩阵列表列表
【发布时间】:2015-03-01 17:09:04
【问题描述】:

我正在尝试操作一个 R 列表,这些列表本身包含矩阵。我想做的类似于question,其中矩阵列表 l 使用do.call(rbind, l) 或来自plyrrbind.fill.matrix(l) 函数组合成一个矩阵。但是,我想组合来自顶级列表不同元素的矩阵,同时保留较低级别的分组,最终得到一个矩阵列表,其中单独的元素对应于较低级别列表的分组。

例如,考虑由三个较低级别列表构成的顶级列表 toplist:

lowerlist1 = list(matrix1_1, matrix1_2, matrix1_3, matrix1_4)
lowerlist2 = list(matrix2_1, matrix2_2, matrix2_3, matrix2_4)
lowerlist3 = list(matrix3_1, matrix3_2, matrix3_3, matrix3_4)
toplist = list(lowerlist1, lowerlist2, lowerlist3)

所有矩阵都具有相同的列数,但可能具有不同的行数。最后,我想要一个具有以下结构的新列表 newtoplist

newmatrix1 = rbind(matrix1_1, matrix2_1, matrix3_1)
newmatrix2 = rbind(matrix1_2, matrix2_2, matrix3_2)
newmatrix3 = rbind(matrix1_3, matrix2_3, matrix3_3)
newmatrix4 = rbind(matrix1_4, matrix2_4, matrix3_4)
newtoplist = list(newmatrix1, newmatrix2, newmatrix3, newmatrix4)

所以一个完整的例子是:

matrix1_1 = matrix(1.1, 4, 5)
matrix1_2 = matrix(1.2, 3, 5)
matrix1_3 = matrix(1.3, 2, 5)
matrix1_4 = matrix(1.4, 3, 5)
matrix2_1 = matrix(2.1, 2, 5)
matrix2_2 = matrix(2.2, 4, 5)
matrix2_3 = matrix(2.3, 5, 5)
matrix2_4 = matrix(2.4, 2, 5)
matrix3_1 = matrix(3.1, 2, 5)
matrix3_2 = matrix(3.2, 4, 5)
matrix3_3 = matrix(3.3, 5, 5)
matrix3_4 = matrix(3.4, 2, 5)

lowerlist1 = list(matrix1_1, matrix1_2, matrix1_3, matrix1_4)
lowerlist2 = list(matrix2_1, matrix2_2, matrix2_3, matrix2_4)
lowerlist3 = list(matrix3_1, matrix3_2, matrix3_3, matrix3_4)
toplist = list(lowerlist1, lowerlist2, lowerlist3)

newmatrix1 = rbind(matrix1_1, matrix2_1, matrix3_1)
newmatrix2 = rbind(matrix1_2, matrix2_2, matrix3_2)
newmatrix3 = rbind(matrix1_3, matrix2_3, matrix3_3)
newmatrix4 = rbind(matrix1_4, matrix2_4, matrix3_4)
newtoplist = list(newmatrix1, newmatrix2, newmatrix3, newmatrix4)

一般可以这样吗?

【问题讨论】:

  • lapply(l, function(x) do.call(rbind,x))
  • 抱歉,Khashaa,我希望从顶层而不是较低级别的列表中加入矩阵。
  • 所有相同维度的矩阵?您应该提供可重现的 ex.
  • 所有矩阵的列数相同,但在我的特定应用程序中它们可能具有不同的行数。

标签: r plyr do.call


【解决方案1】:
newtoplist<-mapply(rbind,lowerlist1,lowerlist2,lowerlist3)

【讨论】:

  • 虽然在我的实际应用程序中我有不同数量的无法硬编码的顶级列表条目,但它在这里有效。
  • 你的意思是lowerlist的数量很大。
  • 不一定很大 - 它实际上对应于我在使用 parallel 包时运行函数的处理器内核数量。
  • 考虑添加解释为什么这是一个好的解决方案。一行代码看起来像是一个低质量的答案,并进入了“低质量帖子”的审核队列。
【解决方案2】:

如果您不能使用@Metrics 回答中的mapply(当您有太多lowerlist 项目要写出时),这样的事情可能会起作用。为了便于阅读,我使用了magrittr 管道。

n <- length(toplist)
k <- sapply(toplist, length)[1] #assuming that each sublist contains the same number of matrices
num <- seq(1, n*k, by = n)
unlist(toplist, recursive = F) %>% 
    split(., num) %>% 
    lapply(., function(x) do.call(rbind,x))

【讨论】:

  • 这似乎可以解决问题。对于我的应用程序,toplist 中的列表条目数量可能会有所不同,而不是我上面的固定数量。谢谢你。
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 2017-09-11
  • 2017-05-09
  • 1970-01-01
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 2019-04-05
相关资源
最近更新 更多