2017-03-09 3 views
1

Gibt es eine analoge Funktion zu diff(), die aufeinanderfolgende Elemente teilt, anstatt den Unterschied zu finden?Teilen Sie jedes Element eines Vektors mit dem nächsten

x = c(10,8,4,-1) 
some_function(x) 
# [1] 1.25 2.00 -4.00 
+0

geschätzt, aber auch, warum bauen Sie Ihre eigenen, wenn es ein möglicherweise zur Verfügung steht? –

+3

Ich würde mich hier nicht mit einer expliziten Schleife befassen, z.B. 'tail (x, -1)/head (x, -1)' oder führe die Indizierung direkt mit '['. – joran

Antwort

2

Das glaube ich nicht, dass es so etwas wie die in Basis R. Aber Sie können Ihre eigene Lösung zu schaffen, wie

unlist(sapply(2:length(x), function(i) x[i-1]/x[i])) 
# unlist (sort of) takes care of when x has less than 2 elements 

ODER

x[-length(x)]/x[-1] 
+1

Teil meiner Präferenz für den zweiten Ansatz ist, dass Ihre 'sapply' Lösung fällt, wenn' x' von Länge 0 ist. – joran

+0

@joran Oder Länge 1, wenn es 'sapply (2: 1, ...)' – Frank

+0

wird @ Frank, ich denke, 'unlist 'kümmert sich darum –

0

Eine weitere Option mit dplyr versuchen verwendet lag

library(dplyr) 
lag(x)/x 

#[1] NA 1.25 2.00 -4.00 

Wenn Sie NA tun

nur entfernen möchten
y = lag(x)/x 
y[-1] 

#[1] 1.25 2.00 -4.00 
Verwandte Themen