2016-06-02 22 views
0

I Gradientenwerte an Berechnung unter Verwendungsapply nicht (numerisch) Vektor zurück, wenn Gradienten Berechnung

DF$gradUx <- sapply(1:nrow(DF), function(i) ((DF$V4[i+1])-DF$V4[i]), simplify = "vector") 

aber bei der Überprüfung class(DF$gradUx), erhalte ich noch eine Liste. Was ich will, ist ein numerischer Vektor. Was mache ich falsch?

Browse[1]> head(DF) 
    V1 V2   V3   V4  
1 0 0 -2.913692e-09 2.913685e-09       
2 1 0 1.574589e-05 3.443367e-09 
3 2 0 2.111406e-05 3.520451e-09 
4 3 0 2.496275e-05 3.613013e-09 
5 4 0 2.735775e-05 3.720385e-09 
6 5 0 2.892444e-05 3.841937e-09 
+1

Sie erhalten eine Liste weil nicht alle zurückgegebenen Elemente die gleiche Größe haben (die erste und die letzte, die ich vermute). Du solltest besser 'rollapply' in' zoo' verwenden –

Antwort

0

Statt sapply ich sollte einfach diff(DF$V3) verwenden und sie in eine neue data.frame schreiben:

gradients = data.frame(gradUx=diff(DF$V3),gradUy=diff(DF$V4)) 
+1

Ich bin ganz für die Beantwortung deiner eigenen Frage, aber das erzeugt einen anderen Unterschied als in deiner Frage. Meinst du stattdessen 'diff (DF $ V3, lag = 2)'? Ich schlage auch vor, dass Sie diese oder eine der anderen Antworten akzeptieren, wenn die Frage gelöst ist. – r2evans

+0

Mein Fehler. Der Gradient sollte eine einfache Differenz erster Ordnung sein, also "Verzögerung = 1" und in der Frage "DF $ V4 [i + 1] -DF $ V4 [i]" (korrigiert). –

2

Sie werden nur einen numerischen Vektor erhalten, wenn alle Rückgabewerte der Länge 1. Genauer gesagt, werden Sie ein Array, wenn alle Rückgabewerte die gleiche Länge haben. Von ?sapply „Details“:

Vereinfachung in ‚sapply‘ versucht wird, nur dann, wenn ‚X‘ Länge größer als Null ist und wenn die Rückgabewerte von allen Elementen von ‚X‘ sind alle der gleichen (positive) Länge. Wenn die gemeinsame Länge eins ist, ist das Ergebnis ein Vektor, und wenn größer als Eins ist, ist eine Matrix mit einer Spalte, die jedem Element von 'X' entspricht.

Wenn i == 0, wird Ihre Formel numeric(0) zurückkehren, so wird die ganze Rückkehr eine Liste sein.

Sie müssen Ihre Berechnung ändern, um die Indizierung außerhalb der Grenzen Ihres Vektors zu berücksichtigen. DF$V4[1-1] gibt numeric(0) zurück, und DF$V4[nrow(DF)+1] gibt NA zurück. Beheben Sie diese Logik, und Sie sollten das Vektorproblem beheben.

bearbeitet: Aus historischen Gründen falsch die ursprüngliche Frage die Differenz als DF$V4[i+1])-DF$V4[i-1] berechnet, eine Verzögerungsdifferenz 2 geben, während die kürzlich editierte Frage (und die Absicht des OP), die eine liegt-1 Differenz zeigt.

0

Diese Berechnung kann sehr leicht vektorisiert werden, wenn man die Beobachtungen in einer Reihe aufstellen. Ich benutze head und tail die ersten 2 und letzten 2 Beobachtungen fallen:

gradUx <- c(NA, tail(df$V4, -2) - head(df$V4, -2), NA)

> gradUx 
[1]   NA 6.06766e-10 1.69646e-10 1.99934e-10 2.28924e-10   NA 

, die die gleichen Werte wie Ihr Ansatz bietet, in Vektor-Form:

> sapply(1:nrow(df), function(i) ((df$V4[i+1])-df$V4[i-1]), simplify = "vector") 
[[1]] 
numeric(0) 

[[2]] 
[1] 6.06766e-10 

[[3]] 
[1] 1.69646e-10 

[[4]] 
[1] 1.99934e-10 

[[5]] 
[1] 2.28924e-10 

[[6]] 
[1] NA