Add matrices from two lists to R

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

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

 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 size and include all cases that have ever arisen in List1 matrices (6.7 will occur in additional matrices in list 1).

Code to create a list2:

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

List2:

 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 replace the NA in list2, if available, with the values ​​from the corresponding 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 

I believe there is a way to do this using the merge command. However, I have not yet decided the solution, so any input is welcome!

+6
source share
1 answer

Good opportunity to use Map (you have data.frame in your first list, first convert them to 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 suggested by @akrun, a more universal 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)) 
+5
source

Source: https://habr.com/ru/post/981619/


All Articles