2017-10-03 4 views
1

ich auf einer Säule Roll Berechnungen mache, den Code unten mitDoing Roll Berechnungen benutzerdefinierte mit data.table für mehrere Spalten

dt <- data.table(x1=1:8,x2=2:10,x3=4:11,x4=6:12) 
N = 3L 
dt[, y1 := (2*dt$x1[.I] -dt$x1[(.I+N-1L)]), by=1:nrow(dt)] 
dt 


    x1 x2 x3 x4 y1 
1: 1 2 4 6 -1 
2: 2 3 5 7 0 
3: 3 4 6 8 1 
4: 4 5 7 9 2 
5: 5 6 8 10 3 
6: 6 7 9 11 4 
7: 7 8 10 12 13 
8: 8 9 11 6 NA 
9: 1 10 4 7 NA 

sdcols=paste0("x",1:4) 

wie benutzt man sdcols das gleiche Ergebnis für Spalten x1 bis x4 zu erreichen, die Schaffung neuer Spalten Y1 bis Y4

Antwort

2

Vielleicht brauchen wir nicht eine Gruppe, die durch den Betrieb

nm1 <- names(dt) 
dt[, paste0('y', seq_along(nm1)) := lapply(.SD, 
    function(x) c((2*shift(x)- shift(x, type = 'lead'))[-1], NA)), .SDcols = nm1] 
dt 
# x1 x2 x3 x4 y1 y2 y3 y4 
#1: 1 2 4 6 -1 0 2 4 
#2: 2 3 5 7 0 1 3 5 
#3: 3 4 6 8 1 2 4 6 
#4: 4 5 7 9 2 3 5 7 
#5: 5 6 8 10 3 4 6 8 
#6: 6 7 9 11 4 5 7 16 
#7: 7 8 10 12 13 6 16 17 
#8: 8 9 11 6 NA NA NA NA 
#9: 1 10 4 7 NA NA NA NA 
+0

die Lösung funktioniert und ist elegant. Ich habe Probleme, dieses Stück zu entschlüsseln c ((2 * shift (x) - shift (x, type = 'lead')) [- 1], NA)). Warum c, warum [-1] und warum NA? Könnten Sie helfen zu klären? – ashleych

+0

@ashleych Ich habe das verwendet, um die erste Beobachtung zu entfernen und dann mit NA am Ende anhängen, um die Ausgaben zu erhalten – akrun

+0

Ich verstehe nicht wirklich, wie dies für andere Werte der OP-Variablen 'N = 3 'übersetzen würde. – Frank

Verwandte Themen