我有一组数据如下,并希望根据持续时间列计算每个项目的复合因子。 条件是持续时间是12的倍数,然后我将应用一个因子。 例如,第2项的持续时间从M34到M37开始,我将一个因子应用到M36。
然而,棘手的部分是我不想应用任何因素,如果每个项目的持续时间向量中的第一个元素是12的倍数。例如,项目1从M24开始到M27。即使M24是12的倍数,我也不想在这里应用任何因素。
这是我的原始数据集:
ID Rate.1 Duration
1: 1 0.0200 M24
2: 1 0.0200 M25
3: 1 0.0200 M26
4: 1 0.0200 M27
5: 2 0.0200 M34
6: 2 0.0200 M35
7: 2 0.0200 M36
8: 2 0.0200 M37
9: 2 0.0200 M48
我想要的是下面的Rate.2 col:
ID Rate.1 Duration Rate.2
1: 1 0.0200 M24 1
2: 1 0.0200 M25 1
3: 1 0.0200 M26 1
4: 1 0.0200 M27 1
5: 2 0.0200 M34 1
6: 2 0.0200 M35 1
7: 2 0.0200 M36 1.2
8: 2 0.0200 M37 1.2
9: 2 0.0200 M48 1.44
这有什么好的解决方案吗?感谢
答案 0 :(得分:0)
它并不过分整洁。没有循环的编辑解决方案:
df=data.frame("ID"=c(rep(1,4),rep(2,5)),
"Rate.1"=rep(0.02,9),
"Duration"=paste0("M",c(24:27,34:37,48))
)
ids = which(as.numeric(sub("M","",df$Duration[-1]))%%12 == 0)+1
df$Rate.2 = 1
df$Rate.2[ids]=1.2
df$Rate.2=cumprod(df$Rate.2)
df
ID Rate.1 Duration Rate.2
1 1 0.02 M24 1.00
2 1 0.02 M25 1.00
3 1 0.02 M26 1.00
4 1 0.02 M27 1.00
5 2 0.02 M34 1.00
6 2 0.02 M35 1.00
7 2 0.02 M36 1.20
8 2 0.02 M37 1.20
9 2 0.02 M48 1.44
以前使用for循环的解决方案:
df$Rate.2 = 1
ids = which(as.numeric(sub("M","",df$Duration))%%12 == 0)
for(i in 2:nrow(df)){
if(i%in%ids){
df$Rate.2[i:nrow(df)]=df$Rate.2[i:nrow(df)]*1.2
}
}