This time around, since first half of the 2021 is behind us, we are making Calendar in R.
This will be achieved with two useless functions.
Function to draw a month (with optional parameter as current date)
DrawCalendarMonth <- function(InDate=NULL) {
if(is.null(InDate)){
date <- Sys.Date()
} else {
date <- as.Date(InDate)
}
t <- format(date, "%m")
TT <- format(date, "%B")
year <- as.integer(format(date, "%Y"))
# Leap year calculation
if((year %% 4) == 0) {
if((year %% 100) == 0) {
if((year %% 400) == 0) {
leap <- TRUE
} else { leap <- FALSE }
} else { leap <- TRUE }
} else { leap <- FALSE }
#number of days in month
if (t %in% c("01","03","05", "07", "08", "10", "12")){
nofDays <- 31
}
if (t %in% c("04","06","09", "11")){
nofDays <- 30
}
if (t %in% c("02") & leap == TRUE){
nofDays <- 29
}
if (t %in% c("02") & leap == FALSE){
nofDays <- 28
}
firstDay <- as.Date(paste0(format(date, "%Y-%m"), "-01"))
name1D <- weekdays(firstDay)
num1D <- as.POSIXlt(firstDay)$wday
n.col <- 7 #number of days; constant
n.row <- 5 #depends on month, number of days and first day in month; must be calculated
M_y <- 35 # Default matrix size (product of n.col * n.row)
if (num1D > 5 & nofDays > 29) {
n.row <- 6 #nrow correction
M_y <- 42
}
if (num1D %in% c(1) & nofDays %in% c(28)) {
n.row <- 4 #nrow correction
M_y <- 28
}
mat <- matrix(1:M_y, nrow = n.row, ncol = n.col, T) #Matrix structure for month
for(column in 1:n.col){ mat[, column] <- 00 } #Reset values to 00
i <- 1 #running value
for(row in 1:n.row){
for(column in 1:n.col){
if(row >= 1 & column >= num1D | row > 1) {
if(i > nofDays){
mat[row,column] <- 0
} else {
mat[row,column] <- i
i= i + 1
}
}
}
}
dd <- as.data.frame(mat)
colnames(dd) <- c("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun")
cat(paste0("\n", "Month: ",TT, "\n", "Year: ", year, "\n"))
return(dd)
}
Running this function as:
DrawCalendarMonth()
DrawCalendarMonth("2021-02-21")
Function takes into consideration
1. calculation of leap years,
2. the number of weeks per month and
3. most obvious – number of days per month.
Function to draw a year (with optional parameter year)
Next step is no brainer. Creating calendar for complete year is just 12-times iteration of DrawCalendarMonth function.
DrawYear <- function(Year=NULL){
if(is.null(Year)){
year <- as.integer(format(Sys.Date(), "%Y"))
} else {
year <- as.integer(Year)
}
dateFrom <- as.Date(paste0(year,"0101"), "%Y%m%d")
dateTo <- as.Date(paste0(year,"1201"), "%Y%m%d")
FirstOfMonth <- format(seq(dateFrom,dateTo,by="month"), "%Y-%m-%d")
for (i in 1:length(FirstOfMonth)){
r <- DrawCalendarMonth(FirstOfMonth[i])
print(r)
}
}
Running it as:
# Draw years' calendar
DrawYear(2020)
DrawYear()
And result is a complete calendar 🙂
As always, code is available in at the Github in same Useless_R_function repository. And this function is here.
Happy R-coding!
What are next step for these two functions:
- Create export to Markdown (because why not)
- Sort out the week enumerator (in both functions)
- Set the start of week (Sunday or Monday)
- Draw it with ggplot2 library and colour all important dates, bank holidays and festivals
[…] by data_admin [This article was first published on R – TomazTsql, and kindly contributed to R-bloggers]. (You can report issue about the content on this page […]
LikeLiked by 1 person
system(‘cal’)
LikeLiked by 1 person
True! Now we have reversed it and calendar for complete year! 🙂
LikeLiked by 1 person
Nice, but I am wondering why you show code that may be interpreted as some code written by somebody coming directly from C. For example the beginning of y our first function may be rewritten as :
date <- if(is.null(InDate)) Sys.Date() else as.Date(InDate)
leap <- if((year %% 4) == 0)
if((year %% 100) == 0) ((year %% 400) == 0) else TRUE
else FALSE
more R-y (no instructions, only functions) and shorter to be read.
LikeLiked by 1 person
[…] Little useless-useful R functions – Drawing calendar […]
LikeLiked by 1 person