我有一个代码,其中有一个场景(sc
列)和一个代码名称(cd
列)。我想计算所有场景与第一个场景之间的差异(所以场景2-1
,3-1
等等。我还有多个场景......)。有没有一种快速的方法来编码将要比较哪个场景,例如,如果我现在所有其他场景的比较场景现在是场景 2,那将是1-2
,3-2
等等?
但我也想确保在场景之间只减去相同的代号名称(cd
),所以(sc1.cd1 - sc2.cd1
),(sc1.cd2 - sc2.cd2
)等等。
sc
我还想要了解每个代码中 1 与其他场景之间的百分比差异。
目前,我的代码假设当我比较场景时,它们cd
的顺序相同。有没有办法将场景和代码一起比较,而不是使用数据子集?
set.seed(123456)
vals = as.vector(mapply(FUN = rpois, n = 10, lambda = c(5, 10, 100)))
df.test = data.frame(cd = rep(1:10,3), sc = rep(1:3, each =10 ), vals)
# New empty column
df.test$delta = NA
# Subset each scenarios and subtract for the first scenario
df.test[df.test$sc ==1,'delta'] = df.test[df.test$sc ==1,'vals']-df.test[df.test$sc ==1,'vals']
df.test[df.test$sc ==2,'delta'] = df.test[df.test$sc ==2,'vals']-df.test[df.test$sc ==1,'vals']
df.test[df.test$sc ==3,'delta'] = df.test[df.test$sc ==3,'vals']-df.test[df.test$sc ==1,'vals']
# Get difference
df.test$diff = abs(abs(df.test$delta) - df.test$vals)
# Calculate percentage
df.test$delta.perc = abs(df.test$delta) / df.test$diff +1
df.test$diff * df.test$delta.perc
# Percentage increase
df.test$delta.perc.increase = df.test$delta.perc *100
您可以
sapply
对 进行减法运算unique(sc)
。使用时transform
您不需要df.test$
一直书写。使用
within
,更简洁,但新的列是向后排序的。问题在于,您已经对场景之间的差异进行了硬编码,同时假设
cd
值将完全一致,这使得更改基本场景并不十分麻烦,但绝对很麻烦。我们可以使用
dplyr
来处理分组和计算,这样我们就可以动态设置任何基本场景,例如1
,2
或任何您想要的。我们还将确保仅在匹配cd
值之间计算差异,因此不存在任何假设。这样,您可以将 设置
base_scenario
为您想要的任何值,它会自动更新,通过分组,cd
我们确保delta
是针对每个 单独计算的cd
,因此您可以得到sc1.cd1 - sc2.cd2
而不是按顺序减去行。我还添加了以防止在基值为 时出现ifelse
任何错误。div/0
0
通过这种方式,您可以将 更改
base_scenario
为任意值,并且它也会随之改变 - 因此当基数设置为 时,您将获得 、1-2
等。3-2
2
如果我没有解释清楚,请随意在回复中留下问题:)