合并 N 个列表中的 i:th 矩阵
combine the i:th matrix from N lists
我想合并存储在多个列表中的大型矩形矩阵。例如。 rbind.fill.matrix {plyr}
所有 N
列表中的 i:th 矩阵。每个列表中的矩阵数量 n
在 N
个列表中是相等的。
#Dummy data using N=2, n=2
# binary matrices
ls1 <- replicate(n=2, list(matrix(rbinom(1,0.5,n=20), nrow=2)))
ls2 <- replicate(n=2, list(matrix(rbinom(1,0.5,n=12), nrow=2)))
ls1 <- lapply(ls1, "colnames<-", head(LETTERS,ncol(ls1[[1]])))
ls1 <- lapply(ls1, "rownames<-", 1:2)
# create some overlap
ls2 <- lapply(ls2, "colnames<-", c("A","E",tail(LETTERS,ncol(ls2[[1]])-2)))
ls2 <- lapply(ls2, "rownames<-", 1:2)
对于所有 N
个列表和 n
个矩阵,结果将类似于 rbind.fill.matrix(ls1[[1]], ls2[[1]])
。
我试过类似这样的方法,显然不行。它所做的是将每个列表中的每个矩阵组合起来。
lsNames <- c("ls1", "ls2")
sapply( lsNames, function(x) do.call(rbind.fill.matrix, get(x)))
非常感谢任何指点,谢谢!
如果 ls1 和 ls2 的长度相等:
lapply( seq_along(ls1), function(i) {
rbind.fill.matrix(ls1[[i]], ls2[[i]])
} )
结果:
# [[1]]
# A B C D E F G H I J W X Y Z
# [1,] 0 1 1 0 0 0 0 1 1 0 NA NA NA NA
# [2,] 0 1 1 0 0 1 1 0 0 0 NA NA NA NA
# [3,] 0 NA NA NA 0 NA NA NA NA NA 0 0 1 1
# [4,] 0 NA NA NA 0 NA NA NA NA NA 1 1 1 0
#
# [[2]]
# A B C D E F G H I J W X Y Z
# [1,] 1 1 1 0 1 1 0 1 1 1 NA NA NA NA
# [2,] 1 1 1 0 0 0 0 1 1 0 NA NA NA NA
# [3,] 0 NA NA NA 0 NA NA NA NA NA 1 0 0 1
# [4,] 0 NA NA NA 0 NA NA NA NA NA 0 1 1 1
对于多个列表
# create list of lists:
list_of_lists <- list(ls1, ls2)
lapply( seq_along(list_of_lists[[1]]), function(i) {
arg_lists <- lapply(list_of_lists, function(l) l[[i]])
rbind.fill.matrix(arg_lists)
} )
我想合并存储在多个列表中的大型矩形矩阵。例如。 rbind.fill.matrix {plyr}
所有 N
列表中的 i:th 矩阵。每个列表中的矩阵数量 n
在 N
个列表中是相等的。
#Dummy data using N=2, n=2
# binary matrices
ls1 <- replicate(n=2, list(matrix(rbinom(1,0.5,n=20), nrow=2)))
ls2 <- replicate(n=2, list(matrix(rbinom(1,0.5,n=12), nrow=2)))
ls1 <- lapply(ls1, "colnames<-", head(LETTERS,ncol(ls1[[1]])))
ls1 <- lapply(ls1, "rownames<-", 1:2)
# create some overlap
ls2 <- lapply(ls2, "colnames<-", c("A","E",tail(LETTERS,ncol(ls2[[1]])-2)))
ls2 <- lapply(ls2, "rownames<-", 1:2)
对于所有 N
个列表和 n
个矩阵,结果将类似于 rbind.fill.matrix(ls1[[1]], ls2[[1]])
。
我试过类似这样的方法,显然不行。它所做的是将每个列表中的每个矩阵组合起来。
lsNames <- c("ls1", "ls2")
sapply( lsNames, function(x) do.call(rbind.fill.matrix, get(x)))
非常感谢任何指点,谢谢!
如果 ls1 和 ls2 的长度相等:
lapply( seq_along(ls1), function(i) {
rbind.fill.matrix(ls1[[i]], ls2[[i]])
} )
结果:
# [[1]]
# A B C D E F G H I J W X Y Z
# [1,] 0 1 1 0 0 0 0 1 1 0 NA NA NA NA
# [2,] 0 1 1 0 0 1 1 0 0 0 NA NA NA NA
# [3,] 0 NA NA NA 0 NA NA NA NA NA 0 0 1 1
# [4,] 0 NA NA NA 0 NA NA NA NA NA 1 1 1 0
#
# [[2]]
# A B C D E F G H I J W X Y Z
# [1,] 1 1 1 0 1 1 0 1 1 1 NA NA NA NA
# [2,] 1 1 1 0 0 0 0 1 1 0 NA NA NA NA
# [3,] 0 NA NA NA 0 NA NA NA NA NA 1 0 0 1
# [4,] 0 NA NA NA 0 NA NA NA NA NA 0 1 1 1
对于多个列表
# create list of lists:
list_of_lists <- list(ls1, ls2)
lapply( seq_along(list_of_lists[[1]]), function(i) {
arg_lists <- lapply(list_of_lists, function(l) l[[i]])
rbind.fill.matrix(arg_lists)
} )