我有一个代码,其中有一个场景(
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)
。
> df.test |> within({
+ delta <- sapply(unique(sc), FUN=\(x) {
+ vals[sc == x] - vals[sc == 1]
+ }) |> as.vector()
+ dif <- abs(delta - vals)
+ delta.perc <- abs(delta)/dif + 1
+ delta.perc.increase <- delta.perc*100
+ })
cd sc vals delta delta.perc.increase delta.perc dif
1 1 1 7 0 100.0000 1.000000 7
2 2 1 6 0 100.0000 1.000000 6
3 3 1 4 0 100.0000 1.000000 4
4 4 1 4 0 100.0000 1.000000 4
5 5 1 4 0 100.0000 1.000000 4
6 6 1 3 0 100.0000 1.000000 3
7 7 1 5 0 100.0000 1.000000 5
8 8 1 2 0 100.0000 1.000000 2
9 9 1 11 0 100.0000 1.000000 11
10 10 1 3 0 100.0000 1.000000 3
11 1 2 12 5 171.4286 1.714286 7
12 2 2 14 8 233.3333 2.333333 6
13 3 2 17 13 425.0000 4.250000 4
14 4 2 13 9 325.0000 3.250000 4
15 5 2 8 4 200.0000 2.000000 4
16 6 2 6 3 200.0000 2.000000 3
17 7 2 7 2 140.0000 1.400000 5
18 8 2 13 11 650.0000 6.500000 2
19 9 2 13 2 118.1818 1.181818 11
20 10 2 10 7 333.3333 3.333333 3
21 1 3 92 85 1314.2857 13.142857 7
22 2 3 85 79 1416.6667 14.166667 6
23 3 3 105 101 2625.0000 26.250000 4
24 4 3 92 88 2300.0000 23.000000 4
25 5 3 94 90 2350.0000 23.500000 4
26 6 3 101 98 3366.6667 33.666667 3
27 7 3 104 99 2080.0000 20.800000 5
28 8 3 95 93 4750.0000 47.500000 2
29 9 3 110 99 1000.0000 10.000000 11
30 10 3 118 115 3933.3333 39.333333 3