[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