Один путь будет:
start = 2.4
end = 1.7
df$Y <- c(start, start - cumsum(df$X[-1] * (start - end)/sum(df$X[-1])))
# X Y
#1 1 2.400000
#2 7 2.211538
#3 3 2.130769
#4 5 1.996154
#5 8 1.780769
#6 3 1.700000
Давайте разберемся с этим. df$X
- это числа, определяющие величину падения
df$X
#[1] 1 7 3 5 8 3
Когда мы делаем
(start - end)/sum(df$X[-1])
#[1] 0.02692308
Это дает нам, сколько составляет 1 единица падения. Мы игнорируем первое значение, так как у нас уже есть это число (2.4
), и мы не хотим принимать это в расчет.
Теперь мы умножим его на X
, так что когда число равно 7, мы получим большее падение, когда оно равно 1, падение будет ниже
df$X[-1] * (start - end)/sum(df$X[-1])
#[1] 0.18846154 0.08076923 0.13461538 0.21538462 0.08076923
Когда вы сравните это с df$X
, вы заметите, что
0.02692308 * 7 = 0.1884615
0.02692308 * 3 = 0.08076923
0.02692308 * 5 = 0.1346154
и т. Д.
Наконец, мы берем кумулятивную сумму (cumsum
), складывая все эти числа, которые мы вычитаем из start
, так что теперь у нас есть относительные падения в соответствии с соответствующими X
.