R 计算复合系数
我有一组数据,如下所示,并希望根据持续时间列计算每个项目的复合系数。 条件是持续时间是12的倍数,然后我将应用一个因子。 例如,项目2的持续时间从M34到M37,我将对M36应用一个系数 然而,棘手的是,如果每个项目的持续时间向量中的第一个元素是12的倍数,我不想应用任何因子。例如,项目1从M24到M27开始。即使M24是12的倍数,我也不想在这里应用任何因子 这是我的原始数据集:R 计算复合系数,r,R,我有一组数据,如下所示,并希望根据持续时间列计算每个项目的复合系数。 条件是持续时间是12的倍数,然后我将应用一个因子。 例如,项目2的持续时间从M34到M37,我将对M36应用一个系数 然而,棘手的是,如果每个项目的持续时间向量中的第一个元素是12的倍数,我不想应用任何因子。例如,项目1从M24到M27开始。即使M24是12的倍数,我也不想在这里应用任何因子 这是我的原始数据集: ID Rate.1 Duration 1: 1
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循环的新解决方案。好多了吗?好多了。非常感谢。你帮我省了很多时间我很高兴“南风”。如果答案有效,请勾选接受:)