R 计算复合系数

R 计算复合系数,r,R,我有一组数据,如下所示,并希望根据持续时间列计算每个项目的复合系数。 条件是持续时间是12的倍数,然后我将应用一个因子。 例如,项目2的持续时间从M34到M37,我将对M36应用一个系数 然而,棘手的是,如果每个项目的持续时间向量中的第一个元素是12的倍数,我不想应用任何因子。例如,项目1从M24到M27开始。即使M24是12的倍数,我也不想在这里应用任何因子 这是我的原始数据集: ID Rate.1 Duration 1: 1

我有一组数据,如下所示,并希望根据持续时间列计算每个项目的复合系数。 条件是持续时间是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
我想要的是下面2列的费率:

          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

有没有一个简洁的解决方案?谢谢,它不太整洁。不带循环的已编辑解决方案:

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

它不太整洁。不带循环的已编辑解决方案:

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

谢谢,代码可以工作,但我希望有一个解决方案不涉及使用循环,因为实际的数据集有超过300000行,所以它确实需要很长时间才能运行。没有for循环的新解决方案。好多了吗?好多了。非常感谢。你帮我省了很多时间我很高兴“南风”。如果有效,请勾选接受答案:)谢谢,代码有效,但我希望找到一个不涉及使用循环的解决方案,因为实际数据集的行数超过300000行,因此运行起来确实需要很长时间。没有for循环的新解决方案。好多了吗?好多了。非常感谢。你帮我省了很多时间我很高兴“南风”。如果答案有效,请勾选接受:)