0

希望它不是重复的,很难正确地表达它(R相对较新)所以问题是:我想使用日期序列,不包括基于行信息的某些工作日。我可以即时使用bizdays和创建calendar对象,但效率很低——我宁愿先创建它们并根据需要使用它们。另一方面,我不想为每个可能发生的单个对象创建一个日历(太多而无法打扰,所有工作日加上带/不带假期的版本的组合)。

我可以创建一个数据框,其中包含每一行的开始/结束日期之间的日期列表,但我需要提供一个包含工作日的日历

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

要提供日历,我必须像这样定义它

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

现在一个工作数据集可以解释我正在努力解决的问题

> 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

使用 udf 我想创建一个日历对象列表,然后我可以将其传递给bizsequsing get(df$S),类似于

require(bizdays)

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

所以现在正确的问题;)首先 - 这是最好的方法吗?那么如果是这样-如何以它们的名称(“ c101”等)创建这3个对象,例如,c100将日历与星期一匹配-这不是问题如何创建日历,因为上述方法有效(这就足够了用名称替换点),但是如果我以动态方式创建名称,如何创建c101将成为日历的对象?我可以想象遍历行,但不知道如何强制将结果对象命名为udf$S. 除非您认为有比get()从预先创建的对象列表中提供相应日历更好的方法(对于具有数千个日期和休息日组合的数据框)。我想基本上以 3 个名为的日历对象结束c010, c110, c001,setDT()但是如果在我运行函数之前扩展表有更多独特的选项来创建所有其他组合

事后思考:我可以将 ID 添加到 udf 并按索引调用日历,然后将索引返回给 df,但我想知道是否可以像我尝试的那样创建对象的动态名称

注意在 Sathish 的带领下,我使用了似乎足够的方法:

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)
}
4

0 回答 0