简体   繁体   English

合并来自R中两个列表的矩阵

[英]Merge matrices from two lists in R

Suppose I have two lists that include several matrices. 假设我有两个包含几个矩阵的列表。 The first list includes matrices with dimensions that differ from matrix to matrix: 第一个列表包括尺寸不同于矩阵的矩阵:

Code to create list1: 创建list1的代码:

d<-c(0,1,0,1)
e<-c(1,0,0,0)
f<-c(0,0,0,0)
g<-c(1,0,0,0)
cn<-c(1,2,3,4)
p<-data.frame(d,e,f,g)
dimnames(p)<-list(cn,cn)

d<-c(0,1,0,1,0)
e<-c(1,0,0,0,0)
f<-c(0,0,0,0,0)
g<-c(1,0,0,0,1)
h<-c(0,0,0,1,0)
cn<-c(1,2,3,4,5)
q<-data.frame(d,e,f,g,h)
dimnames(q)<-list(cn,cn)

list1<-list(p,q)
names(list1)<-1990:1991

List1: 列表1:

list1

$`1990`
  1 2 3 4
1 0 1 0 1
2 1 0 0 0
3 0 0 0 0
4 1 0 0 0

$`1991`
  1 2 3 4 5
1 0 1 0 1 0
2 1 0 0 0 0
3 0 0 0 0 0
4 1 0 0 0 1
5 0 0 0 1 0

The second list includes matrices that always have the same dimensions and include all cases that ever occur in the matrices of List1 (6,7 would occur in additional matrices in list1). 第二个列表包括总是具有相同维度的矩阵,并包括List1矩阵中出现的所有情况(6,7将出现在list1的其他矩阵中)。

Code to produce list2: 产生list2的代码:

o<-matrix(NA,nrow=7,ncol=7)
dimnames(o)<-list(1:7, 1:7)
list2<-list(o,o)
names(list2)<-1990:1991

List2: 列表2:

list2
$`1990`
   1  2  3  4  5  6  7
1 NA NA NA NA NA NA NA
2 NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA

$`1991`
   1  2  3  4  5  6  7
1 NA NA NA NA NA NA NA
2 NA NA NA NA NA NA NA
3 NA NA NA NA NA NA NA
4 NA NA NA NA NA NA NA
5 NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA

What I would like to do is to replace the NA's in list2 with, if available, the values from the respective matrix from list1, so that the result looks like this: 我想要做的是用list1中相应矩阵的值替换list2中的NA(如果可用),以便结果如下所示:

$`1990`
   1  2  3  4  5  6  7
1  0  1  0  1 NA NA NA
2  1  0  0  0 NA NA NA
3  0  0  0  0 NA NA NA
4  1  0  0  0 NA NA NA
5 NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA

$`1991`
   1  2  3  4  5  6  7
1  0  1  0  1  0  NA NA
2  1  0  0  0  0  NA NA
3  0  0  0  0  0  NA NA
4  1  0  0  0  1  NA NA
5  0  0  0  1  0  NA NA
6  NA NA NA NA NA NA NA
7  NA NA NA NA NA NA NA

I suppose there is a way to do this by using the merge command. 我想有一种方法可以通过使用merge命令来完成此操作。 However, I have not figured any solution out yet, so any input is highly welcome! 但是,我还没有想出任何解决方案,所以非常欢迎任何输入!

Good opportunity to use Map (you have data.frame in your first list, convert them in matrix first!): 使用Map好机会(你的第一个列表中有data.frame ,首先在matrix转换它们!):

lst1 = lapply(list1, data.matrix)

> Map(function(m,p) {m[1:nrow(p),1:ncol(p)]=p;m}, list2, lst1)
$`1990`
   1  2  3  4  5  6  7
1  0  1  0  1 NA NA NA
2  1  0  0  0 NA NA NA
3  0  0  0  0 NA NA NA
4  1  0  0  0 NA NA NA
5 NA NA NA NA NA NA NA
6 NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA

$`1991`
   1  2  3  4  5  6  7
1  0  1  0  1  0 NA NA
2  1  0  0  0  0 NA NA
3  0  0  0  0  0 NA NA
4  1  0  0  0  1 NA NA
5  0  0  0  1  0 NA NA
6 NA NA NA NA NA NA NA
7 NA NA NA NA NA NA NA

As per @akrun suggestion, a more generalist solution: 根据@akrun的建议,一个更通用的解决方案:

f = function(A,B)
{
    A[row.names(A) %in% row.names(B), colnames(A) %in% colnames(B)]=B
    A
}

Map(f, list2, lapply(list1, data.matrix))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM