reapply: Apply a Function Across Cells of an Indexed Vector, Giving an...

Description Usage Arguments Details Value Note Author(s) References See Also Examples

Description

Like calling tapply but stretching the result to dimensions of x.

Usage

1
reapply(x, INDEX, FUN, where, ...)

Arguments

x

an atomic object, typically a vector

INDEX

list of factors, each of same length as x

FUN

a function that accepts a vector and returns a vector

where

logical, restricting the domain of x

...

optional arguments to FUN

Details

The function tapply applies FUN to each cell of a vector, as specified by levels of INDEX. reapply repeats that result as necessary to match the number of input elements per cell, and restores the order to that of the original index. Regardless of the length of the value of FUN, the length of the value of reapply is always identical to that of x. If where is specified, elements in x corresponding to FALSE are not passed to FUN. Argument where is recycled as necessary and coerced to logical, with NA set to TRUE.

reapply gives a result similar to stats::ave. However, ave gives a warning if the input for a cell is not a multiple of the output. Also, reapply has a named argument for the index variables, and passes dots to fun; for ave, dots represent the indices, and any extra arguments to fun need to be hard-coded, e.g. in an anonymous function (see examples for ave). Finally, reapply returns NA for any element where some member of INDEX is NA, whereas ave applies FUN to these elements in isolation.

Value

an atomic object, typically a vector

Note

Caution! If FUN is isometric (output has same length as input, e.g. cumsum but not mean) then use of where may give surprising results. If where is ever FALSE, then the input to FUN will be necessarily shorter than the required output, and recycling will be in effect.

Author(s)

Tim Bergsma

References

http://metrumrg.googlecode.com

See Also

Examples

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
theoph <- Theoph[c(1,12,2,13,3,14),]
theoph$avg <- with(theoph,reapply(conc,Subject,mean))
theoph$avg2 <- with(theoph,reapply(conc,Subject,mean,where=Time!=0,na.rm=TRUE))
theoph$sum <- with(theoph,reapply(conc,Subject,cumsum))
theoph
Theoph <- Theoph[Theoph$Subject %in% c(1,2),]
Theoph <- Theoph[distance(within=Theoph$Subject) < 4,]
Theoph$Subject <- as.character(Theoph$Subject)
Theoph$where <- TRUE
Theoph <- within(Theoph, where[Subject == 2 & conc == 0] <- FALSE)
Theoph <- rbind(Theoph, aug(Theoph[1,],Subject = NA))
Theoph$misc <- reapply(Theoph$conc,INDEX=Theoph[,c('Subject','Dose')],
where=Theoph$where,FUN= `[`,1:3)
Theoph
stopifnot(class(reapply(c('foo','bar'),INDEX=c(1,1),FUN=function(x)x=='foo'))=='logical')

metrumrg documentation built on May 2, 2019, 5:55 p.m.