creating list of objects with names from a list

125 Views Asked by At

hopefully it is not a duplicate, rather difficult to phrase it correctly (relatively new to R) So the problem is: I want to use sequences of dates excluding certain weekdays based on the row information. I can use bizdays and create calendar objects on the fly but it is quite inefficient - I would rather have them created before and use as needed. On the other side I do not want to create a calendar for every single object that can happen to occur (too many to bother, combination of all weekdays plus versions with/without holidays).

I can create a dataframe with list of dates between start/end date for every row, but i need to provide a calendar with weekdays

P <- setDT(R)[, list(ID=ID,  
                     dt=bizseq(Start.Date,End.Date, cal)
), by=1:nrow(R)]

To provide a calendar I have to define it like

cal <- Calendar(weekdays=c("monday", "tuesday"))

now a working dataset that could explain what i am struggling with

> M <-c(0,1,1,0)
> T <- c(1,1,1,0)
> W <- c(0,0,0,1)
> df <- data.frame(M,T,W)
> df$S <-paste0("c",df$M,df$T,df$W)
> udf <- unique(df)
> udf
  M T W    S
1 0 1 0 c010
2 1 1 0 c110
4 0 0 1 c001

using udf i would like to create a list of calendar objects that i can afterwards pass to the bizseq using get(df$S), something along the lines of

require(bizdays)

loop or apply?
.... <- Calendar(weekdays=c(ifelse(udf$M==0,"","monday"), ifelse(udf$T==0,"","tuesday"),ifelse(udf$W==0,"","wednesday")))

So now the right questions;) Firstly - is it the best approach? then if so - how to create these 3 objects under their names ("c101" etc), so for example the c100 will match the calendar with Monday on - it is not a question how to create a calendar as the method above works (it is enough to substitute the dots with the name), but how to create object c101 that would become a calendar if i create names in a dynamic way? I could imagine looping through the rows, but have no idea how to force the resulting object to be named udf$S. Unless you reckon there is any better method of providing the corresponding calendar than get() from a list of pre-created objects (for a dataframe with thousands of dates and combination of days off). I would like basically to end up with 3 calendar objects named c010, c110, c001, but if the expanded table has more unique options to create all other combinations before i run the setDT() function

Afterthought: I can add ID to the udf and call the calendars by index and then return the index to df, but I wonder if it is possible to create dynamic names of objects just as I tried

NOTE following Sathish's lead I used what seems sufficient:

for(i in 1:nrow(udf)) {
  cal <- Calendar(weekdays=c(ifelse(udf[i,1]==0,"","monday"), ifelse(udf[i,2]==0,"","tuesday"),ifelse(udf[i,3]==0,"","wednesday")))
  assign(udf[i,4], cal)
}
0

There are 0 best solutions below