所选基本代码与 R 中其他代码相比的滚动差异

问题描述 投票:0回答:1

我有一个代码,其中有一个场景(

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
r diff
1个回答
0
投票

您可以

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
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.