William Dunlap wdunlap at tibco.com
Mon Aug 29 18:31:14 CEST 2016

```The cummax(+-1) trick, along with findInterval(), is most useful for
expanding a list of opening and closing times into a table which can be
used to find the number of open shops at any given time.  E.g., suppose

shopHours <- list(Butcher=rbind(c(Open=8,Close=12), c(13, 17)),
Florist=rbind(c(Open=10,Close=18)),
Pub=rbind(c(Open=10,Close=14), c(16,22)),
Bank=rbind(c(Open=9,Close=15)))

Then you can generate a list of the number of open shops at any time with:

d <- data.frame(Shop=rep(names(shopHours), vapply(shopHours,nrow,0)),
do.call("rbind", shopHours))
d <- with(d, rbind(data.frame(Shop, Hour=Open, Action=+1), data.frame(Shop,
Hour=Close, Action=-1)))
d <- d[order(d\$Hour),]
d\$NumberOpen <- cumsum(d\$Action)
transform(data.frame(Hour=seq(8,22,by=1),
NumberOpen=d\$NumberOpen[findInterval(Hour, d\$Hour)])
#   Hour NumberOpen
#1     8          1
#2     9          2
#3    10          4
#4    11          4
#5    12          3
#6    13          4
#...

Bill Dunlap
TIBCO Software
wdunlap tibco.com

On Mon, Aug 29, 2016 at 8:06 AM, alexander.sommer at tu-dortmund.de <
alexander.sommer at tu-dortmund.de> wrote:

> Dear Bill,
>
> least, this one worked:
>
> library(package = lubridate)   # for a more convenient display of times
>
> i <- 12   # number of time intervals per hour
>
> # creating a data.frame (original example)
> business_hours <- data.frame(t = hm(paste(rep(x = 0:23, each = i), rep(x =
> seq(from = 0, to = 60/i * (i - 1), by = 60/i), times = 24))),
>                              A = c(rep(x = 0, times = (8 - (1/i)) * i), 1,
> rep(x = 0, times = (12   - (1/i)) * i), -1, rep(x = 0, times = (4
>  ) * i)),
>                              B = c(rep(x = 0, times = (9 - (1/i)) * i), 1,
> rep(x = 0, times = (2.75 - (1/i)) * i), -1, rep(x = 0, times = (1.75 -
> (1/i)) * i), 1, rep(x = 0, times = (3.5 - (1/i)) * i), -1, rep(x = 0, times
> = 7 * i)))
>
> # some data analysis
> plot(x = rowSums(x = cumsum(business_hours[, -1])), type = "s")
>
> I find some elegance in this solution; still, Jims proposal looks easier
> to handle to me.
>
> Best regards,
>
> Alex
>
>
> --
> Alexander Sommer
> wissenschaftlicher Mitarbeiter
>
> Technische Universität Dortmund
> Fakultät Erziehungswissenschaft, Psychologie und Soziologie
> Forschungsverbund Deutsches Jugendinstitut/Technische Universität Dortmund
> Vogelpothsweg 78
> 44227 Dortmund
>
> Telefon: +49 231 755-8189
> Telefax: +49 231 755-6553
> E-Mail:  alexander.sommer at tu-dortmund.de
> WWW:     http://www.forschungsverbund.tu-dortmund.de/
> Wichtiger Hinweis: Die Information in dieser E-Mail ist vertraulich. Sie
> ist ausschließlich für den Adressaten bestimmt. Sollten Sie nicht der für
> diese E-Mail bestimmte Adressat sein, unterrichten Sie bitte den Absender
> und vernichten Sie diese Mail. Vielen Dank.
> Unbeschadet der Korrespondenz per E-Mail, sind unsere Erklärungen
> ausschließlich final rechtsverbindlich, wenn sie in herkömmlicher
> Schriftform (mit eigenhändiger Unterschrift) oder durch Übermittlung eines
> solchen Schriftstücks per Telefax erfolgen.
>
> Important note: The information included in this e-mail is confidential.
> It is solely intended for the recipient. If you are not the intended
> Thank you. Without prejudice of e-mail correspondence, our statements are
> only legally binding when they are made in the conventional written form
> (with personal signature) or when such documents are sent by fax.
>

[[alternative HTML version deleted]]

```