# [R] Specification of factors in tapply

Peter Dalgaard BSA p.dalgaard at pubhealth.ku.dk
Wed Feb 21 19:12:50 CET 2001

```Hedderik van Rijn <rijn at swi.psy.uva.nl> writes:

> Second, what are the functions/methods I could use to get these results in a
> more R-ish way? I quite often want to perform some function per subset of a
> dataframe and include the results back into the frame. As in the example I
> sent, finding the first value equal to or larger than 0 per
> subject/condition combination.
>
> Thanks a lot for all the help sofar,
>    Hedderik.
>
> (Just to be sure, I include the example again:)
>
> x <- as.data.frame(list(data=c(-9,0,3,1,-9,1,0,-9,0,3,1,-9,1,0),
>                    subj=c(rep(1,7),rep(2,7)),
>                    cond=rep(c(rep(1,4),rep(2,3)),2)))
>
> x\$first <- unlist(tapply(x\$data,list(x\$subj,x\$cond),
>                        function(x) {
>                          retval<-rep(F,length(x));
>                          if (length(x[x>=0])>0) {
>                            retval[min(which(x>=0))]<-T;
>                          }
>                          print(cbind(x,retval)); # Print some debug info
>                          retval}))

It looks a bit unsafe to rely on the storage order in x. I'd go for
brute force and ignorance:

tb <- tapply(x\$data,list(x\$subj,x\$cond),
function(x) {
retval<-rep(F,length(x));
if (any(x>=0)) {
retval[which(x>=0)]<-T;
}
retval
}

x\$first<-NA
for (i in 1:2)
for (j i 1:2)
x\$first[x\$subj==i & x\$cond==j] <- tb[i,j]

or maybe something like.

fct <- function(x) {
retval<-rep(F,length(x));
if (any(x>=0)) {
retval[which(x>=0)]<-T;
}
retval
}

grp <- interaction(x\$subj,x\$cond)
x\$first <- NA
for (i in levels(grp))
x\$first[grp==i] <- fct(x\$first[grp==i])

--
O__  ---- Peter Dalgaard             Blegdamsvej 3
c/ /'_ --- Dept. of Biostatistics     2200 Cph. N
(*) \(*) -- University of Copenhagen   Denmark      Ph: (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)             FAX: (+45) 35327907
-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-
r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html
Send "info", "help", or "[un]subscribe"
(in the "body", not the subject !)  To: r-help-request at stat.math.ethz.ch
_._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._

```