2016-09-29 2 views
0

Ich habe eine Frage zu Datentabelle bezogen in R. Zum Beispiel habe ich ein Daten wie dieseRun iterativ Reihen von Reihen in data.table

a=data.table(c=(1:10),d=(2:11)) 
a[1,e:=1] 

    c d e 
1: 1 2 1 
2: 2 3 NA 
3: 3 4 NA 
4: 4 5 NA 
5: 5 6 NA 
6: 6 7 NA 
7: 7 8 NA 
8: 8 9 NA 
9: 9 10 NA 
10: 10 11 NA 

Nun, ich mag den Wert von e berechnen , Reihe für Reihe, mit dem Wert von e gleich (c + d) multipliziert mit e der vorherigen Reihe. Daher muss die Datentabelle hier Zeile für Zeile aktualisiert werden. Ich möchte hier keine for-Schleife ausführen, weil es sehr lange dauert. Irgendwelche von Ihnen haben irgendwelche Vorschläge?

Antwort

7

Gefällt mir das?

a[-1, e := c + d] 
a[, e := cumprod(e)] 
#  c d   e 
# 1: 1 2   1 
# 2: 2 3   5 
# 3: 3 4   35 
# 4: 4 5  315 
# 5: 5 6  3465 
# 6: 6 7  45045 
# 7: 7 8  675675 
# 8: 8 9 11486475 
# 9: 9 10 218243025 
#10: 10 11 4583103525 

Edit:

Hier ist eine Lösung mit by. Dies ist jedoch nicht schneller als eine gut geschriebene for-Schleife (z. B. unter Verwendung von set).

a[1, f := 1] 
a[, f := if (.GRP == 1) f 
    else (c + d) * a[.GRP - 1, f] , by = seq_len(nrow(a))] 

Hier ist eine Lösung mit set:

a[1, g := 1] 
for (i in 2 : nrow(a)) set(a, i, "g", a[(i), c + d] * a[(i - 1), g]) 
+0

Danke, ich bin auf der Suche tatsächlich eine allgemeinere Lösung, wenn wir Reihen von Zeilen zu aktualisieren. Diese Lösung kann diese spezifischen Probleme lösen, aber wenn wir uns mit anderen Berechnungen befassen müssen, dann wird es nicht gelöst –

+2

@ThanhQuang Iterieren über die Zeilen einer data.table ist keine gute Idee. Unabhängig davon, wie Sie es tun ('for' loop oder data.tables 'by'), wird es immer langsam sein. Sie sollten nach einer vektorisierten Lösung für Ihr spezifisches Problem suchen, wie ich hier gezeigt habe. Wenn alles andere fehlschlägt, können Sie sich immer an Rcpp wenden. – Roland

+0

Danke für Ihren Kommentar. Meine spezifischen Probleme sind sehr kompliziert, aber kannst du mir zeigen, wie ich es schaffen kann? –