合并R中两个列表中的矩阵 [英] Merge matrices from two lists in R

查看:336
本文介绍了合并R中两个列表中的矩阵的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假设我有两个包含几个矩阵的列表.第一个列表包含尺寸各不相同的矩阵:

Suppose I have two lists that include several matrices. The first list includes matrices with dimensions that differ from matrix to matrix:

创建list1的代码:

Code to create 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

列表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

第二个列表包括始终具有相同维数的矩阵,并包括在List1矩阵中曾经发生的所有情况(在list1中的其他矩阵中将发生6,7).

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).

产生list2的代码:

Code to produce list2:

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

列表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

我想做的是将list2中的NA替换为list1中相应矩阵的值(如果可用),以便结果看起来像这样:

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:

$`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

我想有一种使用merge命令来做到这一点的方法.但是,我还没有找到任何解决方案,因此欢迎任何输入!

I suppose there is a way to do this by using the merge command. However, I have not figured any solution out yet, so any input is highly welcome!

推荐答案

使用Map的好机会(您在第一个列表中有data.frame,首先在matrix中进行了转换!):

Good opportunity to use Map (you have data.frame in your first list, convert them in matrix first!):

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

按照@akrun的建议,这是一种更全面的解决方案:

As per @akrun suggestion, a more generalist solution:

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))

这篇关于合并R中两个列表中的矩阵的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆