计算复合因子

时间:2017-11-16 06:58:12

标签: r

我有一组数据如下,并希望根据持续时间列计算每个项目的复合因子。 条件是持续时间是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

这有什么好的解决方案吗?感谢

1 个答案:

答案 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
      }
    }