[R] Divide matrix into multiple smaller matrices

mdvaan mathijsdevaan at gmail.com
Thu May 26 14:22:36 CEST 2011


Hi list,

Using the script below, I have generated two lists (c and h) containing
yearly matrices. Now I would like to divide the matrices in c into multiple
matrices based on h. The number of matrices should be equal to:
length(unique(DF1$B))*length(h). So each unique value in DF1$B get's a
yearly matrix. Each matrix should contain all values from c where element
cij is 1. An example for DF1$B = 8025 in 1999:

           8025           8026          8027
8025 0.00000000 0.27547644 0.06905066
8026 0.27547644 0.00000000 0.10499739
8027 0.06905066 0.10499739 0.00000000

Any ideas on how to tackle this problem? Thanks a lot!

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)) # Where Column B
represents the cases, C is the year and D-G are the types of knowledge units
covered

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))))
c<-lapply(c, function (x) 1-x)
c<-lapply(c, function (x) ifelse(x<0.000000111, 0, x))# These are the yearly
distance matrices for a 4 year moving window

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))# These are the adjacency matrices
per year


--
View this message in context: http://r.789695.n4.nabble.com/Divide-matrix-into-multiple-smaller-matrices-tp3552399p3552399.html
Sent from the R help mailing list archive at Nabble.com.



More information about the R-help mailing list