2010-06-28 40 views
1

我知道这个答案必须在那里,但我无法弄清楚如何说出问题。请参阅R中的相关行

我想计算我的data.frame中的值之间的差异。

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 

这样::

从这个

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

但我不知道如何有一个(即上一年的本年度负值的值)导致从另一行创建的一行。任何帮助?

感谢, 汤姆

回答

10

有许多不同的方法可以做到这一点,但这里有一个:

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

更一般地,如果你想指的是相行,你可以使用lag()或做它直接与指标:

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

完美!谢谢。 – Tom 2010-06-28 14:06:27

+0

@Tom:太好了!请在您获得机会时将其标记为已接受,以便人们知道这是回答您的问题。 – Shane 2010-07-06 23:52:03

1

使用diff功能

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

如果year列没有排序,那么你可以使用match

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

@mbq你能更具体吗?对于1,000,000行时间是相似的(我的0.8秒,Shane的0.3)。而当你添加排序然后更慢(排序1.5秒)。 – Marek 2010-06-29 22:14:47

+0

你说得对,对不起;这是一个不错的解决方案。我读得太快了,误解了你的代码。我会尽力将其删除,以免混淆人。 – mbq 2010-06-29 23:34:56