R中的日历(再次)操作

时间:2015-09-30 13:02:40

标签: r

我有这样的代码:

today<-as.Date(Sys.Date())
spec<-as.Date(today-c(1:1000))
df<-data.frame(spec)
stage.dates<-as.Date(c('2015-05-31','2015-06-07','2015-07-01','2015-08-23','2015-09-15','2015-10-15','2015-11-03'))
stage.vals<-c(1:8)
stagedf<-data.frame(stage.dates,stage.vals)
df['IsMonthInStage']<-ifelse(format(df$spec,'%m')==(format(stagedf$stage.dates,'%m')),stagedf$stage.vals,0)

这产生了错误的输出,即

df.spec, df.IsMonthInStage
2013-05-01, 0
2013-05-02, 1
2013-05-03, 0
....
2013-05-10, 1

它似乎在循环,所以stage.dates是8长,它正在重复&#39; TRUE&#39;每8日比赛一次。我如何解决这个问题,以便它在整个月中标记为1它是否处于阶段值?

或者奖励声望 - 如何设置它以便在不同的stage.dates之间,它将填充最近阶段的1,2,3等?

例如:

5月31日至6月7日将填充1月,7月7日至7月1日将填充2等,11月3日至5月30日将填充8?

由于

编辑:

我理解后者在功能上与前一个问题不同。我最终试图达到两者(出于不同的原因),所以所有的答案都赞赏

1 个答案:

答案 0 :(得分:1)

看看是否有效。

根据stage.dates将数据视为您的存储桶来剪切和拆分数据。你不需要顺便提一下stage.vals

剪切和拆分

data<-split(df, cut(df$spec, stagedf$stage.dates, include.lowest=TRUE))

这应该会为您提供按data.frame

分割的stage.dates列表

现在mutate您的数据带索引..这就是您的stage.vals

<强>突变

data<-lapply(seq_along(data), function(index) {mutate(data[[index]],
IsMonthInStage=index)})

现在使用ldply

加入列表中的数据框

<强>加入

data=ldply(data)

但是,这将提供或订购日期,您可以通过

安排

<强>排序

arrange(data,spec)

最终输出

data[1:10,]
         spec IsMonthInStage
1  2015-05-31              1
2  2015-06-01              1
3  2015-06-02              1
4  2015-06-03              1
5  2015-06-04              1
6  2015-06-05              1
7  2015-06-06              1
8  2015-06-07              2
9  2015-06-08              2
10 2015-06-09              2