1) per il ciclo Normalmente si basta usare un semplice ciclo per questo:
MyData <- data.frame(A = c(5, 10, 15, 20))
MyData$b <- 0
n <- nrow(MyData)
if (n > 1) for(i in 2:n) MyData$b[i] <- (MyData$A[i] + 13 * MyData$b[i-1])/ 14
MyData$b[1] <- NA
dono:
> MyData
A b
1 5 NA
2 10 0.7142857
3 15 1.7346939
4 20 3.0393586
2) Riduci Sarebbe anche possibile utilizzare Reduce
. Un primo definisce una funzione f
che effettua il corpo del ciclo e quindi abbiamo Reduce
invocare ripetutamente simili:
f <- function(b, A) (A + 13 * b)/14
MyData$b <- Reduce(f, MyData$A[-1], 0, acc = TRUE)
MyData$b[1] <- NA
dare lo stesso risultato.
Questo dà l'impressione di essere vettorializzato, ma in effetti se si guarda la fonte di Reduce
fa un ciclo for
stesso.
3) filtro Notando che la forma del problema è un filtro ricorsivo con coefficiente 13/14 operante su A/14 (ma con A [1] sostituito da 0) possiamo scrivere quanto segue. Poiché filter
restituisce una serie storica, viene utilizzato c(...)
per convertirlo in un vettore ordinario. Questo approccio in realtà è vettorizzato come l'operazione di filtro viene eseguita in C.
MyData$b <- c(filter(replace(MyData$A, 1, 0)/14, 13/14, method = "recursive"))
MyData$b[1] <- NA
di nuovo dando lo stesso risultato.
Nota: Tutte le soluzioni presuppongono che MyData
disponga di almeno una riga.
fonte
2016-01-06 03:54:38
Benvenuti in SO, questa è una buona prima domanda +1, tuttavia non è necessario dare un ringraziamento gentile nella domanda qui, anche se sembra carino tende a distrarre dalla domanda ed è meglio mostrare apprezzamento upvoting o accettare risposte. – Vality
Si potrebbe voler cercare e provare lag() da dplyr. Senza conoscere i dati e l'output desiderato, è molto difficile aiutare con una risposta. – Gopala
Si prega di fornire un esempio riproducibile minimo. Questo renderà la tua domanda una "prima buona" prima domanda. –