[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