[R] Trying to get an apply to work with a list in applying names totables

John Kane jrkrideau at yahoo.ca
Thu Feb 22 12:30:07 CET 2007


--- Marc Schwartz <marc_schwartz at comcast.net> wrote:

> I might suggest an alternative, since you seem to be
> creating the
> underlying data set from scratch.

Thanks Marc.  I see what you're suggesting but I am
not creating the data from scratch.  The data base
represented by "cc"  is an SPSS file that I have
inherited.  

Still I am having to do enough mucking about with the
SPSS file anyway that your approach might be the best
way to go if I do this again. I wish I had asked this
question a week ago!

> Create the data frame with the requisite data
> structures to start with
> and then perform the table operations:
> 
> 
> # First create your vectors as factors. See ?factor
> aa <- factor(c(2,2,1,1,2), levels = 1:2, labels =
> c("yes", "no"))
> bb <- factor(c(5,6,6,7,4), levels = 4:7, labels =
> letters[1:4])
> 
> 
> # Now create your data frame using the names you
> want for each column
> cc <- data.frame(abby = aa, billy = bb)
> 
> 
> Now run the table on each column:
> 
> > lapply(cc, table)
> $abby
> 
> yes  no 
>   2   3 
> 
> $billy
> 
> a b c d 
> 1 1 2 1 
> 
> 
> See ?lapply as well. Note that a data frame is a
> list:
> 
> > is.list(cc)
> [1] TRUE
> 
> > is.data.frame(cc)
> [1] TRUE
> 
> 
> > as.list(cc)
> $abby
> [1] no  no  yes yes no 
> Levels: yes no
> 
> $billy
> [1] b c c d a
> Levels: a b c d
> 
> 
> HTH,
> 
> Marc Schwartz
> 
> 
> On Wed, 2007-02-21 at 17:15 +0100, ONKELINX, Thierry
> wrote:
> > John,
> > 
> > Two things. You don't need to pout the cc variable
> in the apply. Use
> > instead something like this.
> > 
> > apply(cc, 2, fn1, y = mylist)
> > 
> > But this still doesn't solve your problem. You'll
> need to rewrite your
> > function like this.
> > 
> > > fn2 <- function(x, y, i){
> > +   tt <- table(x[, i])
> > +   names(tt) <- y[[i]]
> > +   return(tt)
> > + }
> > > sapply(1:ncol(cc), fn2, x = cc, y = mylist)
> > [[1]]
> > yes  no 
> >   2   3 
> > 
> > [[2]]
> > a b c d 
> > 1 1 2 1 
> > 
> > Cheers,
> > 
> > Thierry
> 
> > -----Oorspronkelijk bericht-----
> > Van: r-help-bounces at stat.math.ethz.ch
> > [mailto:r-help-bounces at stat.math.ethz.ch] Namens
> John Kane
> > Verzonden: woensdag 21 februari 2007 16:47
> > Aan: R R-help
> > Onderwerp: [R] Trying to get an apply to work with
> a list in applying
> > names totables
> > 
> > I am trying to use apply and a  list to supply
> names
> > to a set of tables I want to generate. Below is an
> > example that I hope mimics the larger original
> > problem.
> > 
> > EXAMPLE
> > 
> > aa <- c( 2,2,1,1,2)
> > bb <- c(5,6,6,7,4)
> > aan <- c("yes", "no")
> > bbn <- c("a", "b", "c", "d")
> > mynames <- c("abby", "billy")
> > mylist <- list(aan, bbn);   names(mylist) <-
> mynames
> > 
> > cc <- data.frame(aa,bb)
> > fn1 <- function(x,y) {tt <- table(x); names(tt)<-
> > mylist[[y]]}
> > jj <-apply(cc, 2, fn1(cc,mylist))
> > 
> > RESULT:  
> > Error in fn1(cc, mylist) : invalid subscript type
> > 
> > To be honest I didn't expect it to work since that
> > fin1(cc  looks recursive but oh well...
> > 
> > Can anyone offer a solution or some advice here. 
> It
> > would be greatly appreciated
> 
> 
>



More information about the R-help mailing list