2010-06-28 2 views
1

Je sais que cette réponse doit être disponible, mais je n'arrive pas à comprendre comment formuler la question.Reportez-vous aux lignes relatives dans R

Je voudrais calculer les différences entre les valeurs dans mon data.frame.

de ceci:

f <- data.frame(year=c(2004, 2005, 2006, 2007), value=c(8565, 8745, 8985, 8412)) 

    year value 
1 2004 8565 
2 2005 8745 
3 2006 8985 
4 2007 8412 

à ceci:

year value diff 
1 2004 8565 NA 
2 2005 8745 180 
3 2006 8985 240 
4 2007 8412 -573 

(c.-à-valeur de la valeur moins l'année en cours de l'année précédente)

Mais je ne sais pas comment avoir un résulte en une ligne créée à partir d'une autre ligne. De l'aide?

Merci, Tom

Répondre

10

Il existe de nombreuses façons de faire, mais voici une:

f[, "diff"] <- c(NA, diff(f$value)) 

Plus généralement, si vous voulez faire référence aux lignes relatives, vous pouvez utiliser lag() ou faire directement avec des index:

f[-1,"diff"] <- f[-1, "value"] - f[-nrow(f), "value"] 
+0

Parfait! Je vous remercie. – Tom

+0

@Tom: Super! Veuillez marquer ceci accepté quand vous avez une chance pour que les gens sachent que ceci répond à votre question. – Shane

1

Utilisez la fonction diff

f <- cbind(f, c(NA, diff(f[,2]))) 
1

Si year colonne n'est pas triée, vous pouvez alors utiliser match:

f$diff <- f$value - f$value[match(f$year-1, f$year)] 
+0

@mbq Pourriez-vous être plus précis? Pour 1.000.000 lignes les temps sont similaires (mon 0.8sec, 0.3 de Shane). Et quand vous ajoutez le tri, c'est beaucoup plus lent (1.5sec pour le tri). – Marek

+0

Vous avez raison, désolé; C'est une bonne solution. Je l'ai lu trop vite et j'ai mal compris votre code. Je vais essayer de l'enlever pour ne pas perturber les gens. – mbq

Questions connexes