2016-03-25 13 views
1

Ich möchte die data.table Funktionen verwenden, um den Wert einer Spalte zu aktualisieren, indem Sie den Wert in vorherigen Zeilen auf den Wert verweisen. Hier ist ein BeispielAktualisieren der Spaltenwerte mit der vorherigen Zeile

> DT<-data.table(id=1:2,x=1:10,y=1) 

Ich wusste schon data.table wie unten zu vorherigen Zeilen in einer Art und Weise beziehen:

> DT[,z:=cumsum(y),keyby=id] 
> DT[] 
    id x y z 
1: 1 1 1 1 
2: 1 3 1 2 
3: 1 5 1 3 
4: 1 7 1 4 
5: 1 9 1 5 
6: 2 2 1 1 
7: 2 4 1 2 
8: 2 6 1 3 
9: 2 8 1 4 
10: 2 10 1 5 

jedoch das nächste Beispiel nicht funktioniert, wo versucht, eine Fibonacci Serie erstellen mit vorherige Werte in Spalte y zu aktualisieren. Es scheint, dass data.table keine Schleife verwendet, um die Berechnung iterativ durchzuführen. Kann jemand mir erklären, wie man dieses freundliche Problem unter Verwendung data.table elegant löst?

> DT[,y:=shift(y,1,fill=0)+shift(y,2,fill=0),] 
> DT[] 
    id x y z 
1: 1 1 0 1 
2: 1 3 1 2 
3: 1 5 2 3 
4: 1 7 2 4 
5: 1 9 2 5 
6: 2 2 0 1 
7: 2 4 1 2 
8: 2 6 2 3 
9: 2 8 2 4 
10: 2 10 2 5 

Was ich wirklich will unten ist (Spalte y wird aktualisiert):

id x y z 
1: 1 1 1 1 
2: 1 3 1 2 
3: 1 5 2 3 
4: 1 7 3 4 
5: 1 9 5 5 
6: 2 2 1 1 
7: 2 4 1 2 
8: 2 6 2 3 
9: 2 8 3 4 
10: 2 10 5 5 
+0

Sind Sie speziell nach einer "Fibonacci" -Sequenz oder einer allgemeineren Antwort? – SymbolixAU

+1

Danke für deine Antwort, ich suche nach allgemeineren Antworten für diese Art von Problem, "Fibonacci" ist nur ein Beispiel – xappppp

Antwort

5

generieren Fibonacci-Zahlen ist per Definition ein sequentielles Problem, das wir in data.table durch die Definition einer benutzerdefinierten Funktion lösen könnte, das funktioniert mit einer for.loop unter der Haube.

# Define function 
fibon <- function(x) { 
    for(i in 3:length(x)) x[i] = x[i-1] + x[i-2] 
    return(x) 
} 

# Plug into data.table 
DT[,y := fibon(y), by = id] 
> DT 
# id x y z 
#1: 1 1 1 1 
#2: 1 3 1 2 
#3: 1 5 2 3 
#4: 1 7 3 4 
#5: 1 9 5 5 
#6: 2 2 1 1 
#7: 2 4 1 2 
#8: 2 6 2 3 
#9: 2 8 3 4 
#10: 2 10 5 5 
+0

Danke, deine Lösung funktioniert! – xappppp

Verwandte Themen