Storing business hours
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.