[R] Storing business hours

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
your raw data comes from business hours posted on web sites:

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,
>
> thank you for your help. I think, I finally understood your advice. At
> 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
> recipient of this e-mail please contact the sender and delete this message.
> 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]]



More information about the R-help mailing list