我有这样的代码:
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长,并且每8位重复一次“ TRUE”匹配。我该如何解决这个问题,以便它将在阶段val的整个月内标记为1?
还是为了获得奖励声望-如何设置它,以便在不同的stage.dates之间填充最近阶段的1、2、3等?
例如:
5月31日至6月7日将填充1,6月7日至7月1日将填充2,依此类推,11月3日至5月30日将填充8?
谢谢
编辑:
我赞赏后者在功能上与前一个问题有所不同。我最终试图达到两者(出于不同的原因),因此感谢所有回答
看看是否可行。
根据将数据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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句