我有这样的代码:
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?
由于
编辑:
我理解后者在功能上与前一个问题不同。我最终试图达到两者(出于不同的原因),所以所有的答案都赞赏
答案 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