[R] apply: return list of matrices

Thaler, Thorn, LAUSANNE, Applied Mathematics Thorn.Thaler at rdls.nestle.com
Tue Jul 20 11:51:22 CEST 2010


Works as expected, THX a lot.

BR thorn

> -----Original Message-----
> From: Dimitris Rizopoulos [mailto:d.rizopoulos at erasmusmc.nl]
> Sent: mardi 20 juillet 2010 11:41
> To: Thaler,Thorn,LAUSANNE,Applied Mathematics
> Cc: r-help at r-project.org
> Subject: Re: [R] apply: return list of matrices
> 
> one approach is the following:
> 
> ddf <- data.frame(a = rep(1:4,3), b = rep(paste("p", 1:3, sep=""),
> each=4), c = c(1,0,0,1,1,1,0,1,1,1,1,1))
> 
> sp <- lapply(split(ddf$c, ddf$b), factor, levels = 0:1)
> combn(sp, 2, FUN = table, simplify = FALSE)
> 
> 
> I hope it helps.
> 
> Best,
> Dimitris
> 
> 
> On 7/20/2010 11:29 AM, Thaler, Thorn, LAUSANNE, Applied Mathematics
> wrote:
> > Hi everybody,
> >
> > Suppose we have the following data structure:
> >
> > ddf<-data.frame(a=rep(1:4,3), b=rep(paste("p", 1:3, sep=""),
each=4),
> > c=c(1,0,0,1,1,1,0,1,1,1,1,1))
> >
> > I want now to make a contingency table for each pair of values of p,
> > i.e. a contingency table for each of the pairs (p1,p2), (p1,p3) and
> > (p2,p3). The result should be given as a list of matrices:
> >
> > # [[1]]<=>  (p1, p2)
> > # [[2]]<=>  (p1, p3)
> > # [[3]]<=>  (p2, p3)
> > [[1]]
> >       [,1] [,2]
> > [1,]    1    1
> > [2,]    0    2
> >
> > [[2]]
> >       [,1] [,2]
> > [1,]    0    2
> > [2,]    0    2
> >
> > [[3]]
> >       [,1] [,2]
> > [1,]    0    1
> > [2,]    0    3
> >
> > Basically, I achieved what I want except that the output format is
> not
> > the way it should be:
> >
> > ct<- function(bc) {
> >    n<- length(bc)
> >    bc<- factor(bc)
> >    table(bc[1:(n/2)], bc[(n/2+1):n])
> > }
> >
> > ct returns a 2x2 table giving the contingency counts.
> >
> > f<- function(p, b) {
> >    allC<- t(combn(levels(as.factor(p)), 2))
> >    bRaw<- apply(allC, 1, function(x) cbind(b[p==x[1]], b[p==x[2]]))
> >
> >    # bRaw would preferable be already a list of nx2 matrices, but
> apply
> > coerces the result to a single matrix,
> >    # whose columns are rbind(b[p==x[1]], b[p==x[2]]), that's why
"ct"
> > takes just one argument and splits the vector
> >
> >    apply(bRaw, 2, ct)
> > }
> >
> > Again the result is one single matrix instead of list of matrices
> (the
> > columns consist of the values of the matrices). I suppose that apply
> > does some sophisticated simplification on the result vector, but how
> can
> > I circumvent this mechanism? For the time being I made another
*apply
> > call, which gives me the same result in the format I'd like: just
> > replace the last line in function f by
> >
> > lapply(apply(bRaw, 2, function(x) list(ct(x))), function(x)
> > matrix(unlist(x),2,2))
> >
> > However, is an additional lapply call really necessary?
> >
> > Thanks 4 ur input,
> >
> > Thorn
> >
> > ______________________________________________
> > R-help at r-project.org mailing list
> > https://stat.ethz.ch/mailman/listinfo/r-help
> > PLEASE do read the posting guide http://www.R-project.org/posting-
> guide.html
> > and provide commented, minimal, self-contained, reproducible code.
> >
> 
> --
> Dimitris Rizopoulos
> Assistant Professor
> Department of Biostatistics
> Erasmus University Medical Center
> 
> Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands
> Tel: +31/(0)10/7043478
> Fax: +31/(0)10/7043014



More information about the R-help mailing list