On Jul 1, 2011, at 8:15 PM, David Winsemius wrote: > > On Jul 1, 2011, at 7:44 PM, Marc Schwartz wrote: > >> On Jul 1, 2011, at 4:50 PM, David Winsemius wrote: >> >>> >>> I would like to do some operations inside a function using only one value >>> for the last dimension of a table/matrix: >>> >>> tabfn <- function (dfrm, facvec, YN ="event"){ >>> return( Etbl <- do.call(table, dfrm[ , c(facvec, "event") ]) ) >>> # just want Etbl[,,,"TRUE"] or Etbl[,, "TRUE"] or Etbl[,"TRUE"] >>> } >>> tbl <- tabfn(testdf, c("x", "y") ) >>> tbl # all value of event returned >>> >>> At the console it is easy for me to count the number of factors and use the >>> right number of commas >>> >>> tbl[ , , "TRUE"] if I only want the slice with that value. How can I do >>> this programmatically? >>> >>> Thnks. >> >> >> David, >> >> I had a vague recollection of something like this coming up at some point in >> the past and it took me a bit to get the right keywords to find it. >> >> I did not realize how far back it was (2001), but here are two possible >> solutions by Peter Dalgaard and Thomas Lumley from the same thread: >> >> https://stat.ethz.ch/pipermail/r-help/2001-October/016110.html >> https://stat.ethz.ch/pipermail/r-help/2001-October/016122.html >> >> It looks like Peter's solution is along the lines of the one that you just >> posted. > > > Yeah. Thanks, Mark. Pretty much the same. Guess I'm in good company. > (Surprised this isn't asked more frequently.) > > testdf <- data.frame(x=sample(letters[1:5], 25, replace=TRUE), > y=sample(letters[1:5], 25, replace=TRUE), > z=sample(letters[1:5], 25, replace=TRUE), > event=sample(c(TRUE, FALSE), 25, replace=TRUE) ) > > etbl <- table(testdf[ , c(c("x", "y"), "event")]) > apply(etbl, seq(length=length(dim(etbl))-1),"[", 2) # Dalgaard 2001 > apply(etbl, 1:(length(dim(etbl))-1), "[", 2) # Winsemius 2011 > > Any idea how to make it a "selection"? By that I mean how to select values of > the last dimension whose "event" values are "TRUE". I get "Error: object > 'event' not found" with any expression involving event, since it is only an > attribute in dimnames. > > >> >> Hope that this helps. > > Yes. At least there is nothing (yet) that I would call "truly elegant". Maybe > it's just that I stumbled on my solution, rather than seeing it as a > glaringly obvious application of apply(..., "[" , index) > >> >> Regards, > > Sorry for the duplicate private message. Meant to hit reply to all.
Not a problem David, I was just in the process of replying to it when I saw this reply. Try this: > apply(etbl, seq(length=length(dim(etbl))-1), function(x) x["TRUE"]) y x a b c d e a 0 1 1 0 0 b 1 0 0 1 0 c 0 0 0 0 0 d 1 0 0 0 2 e 0 1 0 1 0 Seems to work here, at least on your example data, but not fully tested on higher dimensional arrays. I also tried it on the UCBAdmissions data set: > str(UCBAdmissions) table [1:2, 1:2, 1:6] 512 313 89 19 353 207 17 8 120 205 ... - attr(*, "dimnames")=List of 3 ..$ Admit : chr [1:2] "Admitted" "Rejected" ..$ Gender: chr [1:2] "Male" "Female" ..$ Dept : chr [1:6] "A" "B" "C" "D" ... Get Dept == "C": > apply(UCBAdmissions, seq(length=length(dim(UCBAdmissions))-1), function(x) > x["C"]) Gender Admit Male Female Admitted 120 202 Rejected 205 391 It actually scared me that I had any recollection of an isolated post from 10 years ago. Not sure what to make of that... Regards, Marc ______________________________________________ R-help@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.