Jednym podejściem jest użycie cumsum()
i oszukać trochę. Na przykład, biorąc pod uwagę K
:
K <- 1:10
i zachować rzeczy proste dodaję 1
(nie 100
) do K[1]
chcemy produkować:
> 1 + K[1]
[1] 2
> (1 + K[1]) + K[2]
[1] 4
> ((1 + K[1]) + K[2]) + K[3]
[1] 7
....
Jest to skumulowana suma. Musimy trochę oszukiwać ze stałą, którą chcemy dodać do pierwszego elementu, ponieważ chcemy tylko, aby wpłynęło na ten pierwszy element, a nie dodawać go do każdego elementu. Stąd to źle
> L <- cumsum(1 + K)
> L
[1] 2 5 9 14 20 27 35 44 54 65
Co właściwie chcemy to:
> L <- cumsum(c(1, K))[-1]
> L
[1] 2 4 7 11 16 22 29 37 46 56
w którym łączymy stałe do wektora K
jako pierwszy element i zastosować cumsum()
do tego, ale spadnie pierwszy element z wyjścia z cumsum()
.
Można to oczywiście zrobić w nieco prostszy sposób:
> L <- 1 + cumsum(K)
> L
[1] 2 4 7 11 16 22 29 37 46 56
czyli obliczyć cumusum()
i następnie dodać na stałe (co teraz widzisz to co @ gd047 zasugerował w ich odpowiedź.)
+1 Czysty - przegapiłem to, gdy zacząłem pisać moją odpowiedź, tylko po to, by zaatakować mnie, gdy byłem już prawie skończony. –
+1 Trudno mi było znaleźć wektoryzowane rozwiązanie i powróciłem do korzystania z pętli 'for'. Czasy w mojej odpowiedzi pokazują, że jest to strasznie powolne w porównaniu do używania 'cumsum'. –