[R] Selecting cases from matrices stored in lists

mdvaan mathijsdevaan at gmail.com
Mon Aug 22 10:58:07 CEST 2011


Hi,

I have two lists (c and h - see below) containing matrices with similar
cases but different values. I want to split these matrices into multiple
matrices based on the values in h. So, I did the following:

years<-c(1997:1999) 
for (t in 1:length(years)) 
        { 
        year=as.character(years[t]) 
        h[[year]]<-sapply(colnames(h[[year]]), function(var)
h[[year]][h[[year]][,var]>0, h[[year]][var,]>0]) 
        } 

Now that I have created list h (with split matrices), I would like to use
these selections to make similar selections in list c. List c needs to get
the exact same shape as h, so that `8026`in 1997 (c$`1997`$`8026`) looks
like this: 

$`1997`$`8026` 
      B 
B      8025 8026 8029 
  8025   1.0000000 0.7739527 0.9656091 
  8026   0.7739527 1.0000000 0.7202771 
  8029   0.9656091 0.7202771 1.0000000 

Can anyone help me doing this? I have no idea how I can get it to work.
Thank you very much for your help! 


library(zoo) 
DF1 = data.frame(read.table(textConnection("    B  C  D  E  F  G 
8025  1995  0  4  1  2 
8025  1997  1  1  3  4 
8026  1995  0  7  0  0 
8026  1996  1  2  3  0 
8026  1997  1  2  3  1 
8026  1998  6  0  0  4 
8026  1999  3  7  0  3 
8027  1997  1  2  3  9 
8027  1998  1  2  3  1 
8027  1999  6  0  0  2 
8028  1999  3  7  0  0 
8029  1995  0  2  3  3 
8029  1998  1  2  3  2 
8029  1999  6  0  0  1"),head=TRUE,stringsAsFactors=FALSE)) 
  
a <- read.zoo(DF1, split = 1, index = 2, FUN = identity) 
sum.na <- function(x) if (any(!is.na(x))) sum(x, na.rm = TRUE) else NA 
b <- rollapply(a, 3,  sum.na, align = "right", partial = TRUE) 
newDF <- lapply(1:nrow(b), function(i) 
              prop.table(na.omit(matrix(b[i,], nc = 4, byrow = TRUE, 
                dimnames = list(unique(DF1$B), names(DF1)[-1:-2]))), 1)) 
names(newDF) <- time(a) 
c<-lapply(newDF, function(mat) tcrossprod(mat / sqrt(rowSums(mat^2)))) 

DF2 = data.frame(read.table(textConnection("  A  B  C 
80  8025  1995 
80  8026  1995 
80  8029  1995 
81  8026  1996 
82  8025  1997 
82  8026  1997 
83  8025  1997 
83  8027  1997 
90  8026  1998 
90  8027  1998 
90  8029  1998 
84  8026  1999 
84  8027  1999 
85  8028  1999 
85  8029  1999"),head=TRUE,stringsAsFactors=FALSE)) 
  
e <- function(y) crossprod(table(DF2[DF2$C %in% y, 1:2])) 
years <- sort(unique(DF2$C)) 
f <- as.data.frame(embed(years, 3)) 
g<-lapply(split(f, f[, 1]), e) 
h<-lapply(g, function (x) ifelse(x>0,1,0)) 

--
View this message in context: http://r.789695.n4.nabble.com/Selecting-cases-from-matrices-stored-in-lists-tp3759597p3759597.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list