2015-01-06 67 views
1

我在我的脑海里结了一个结,试图为我的问题找到好的搜索条件。我相信这有一个非常简单的解决方案。随时间变化/绝对数字

我有一个看起来像这样的数据:

f = data.frame(
    date = c(
    as.POSIXct('2012-01-01'), 
    as.POSIXct('2012-02-01'), 
    as.POSIXct('2012-03-01') 
), 
    val = c(
    22, 
    45, 
    67 
) 
) 

> f 
     date val 
1 2012-01-01 22 
2 2012-02-01 45 
3 2012-03-01 67 

我想找个什么是“val”中从一个日期至其他(“VAL”的绝对变化在每个第一天取一个月)。所以我的最终结果应该是这样的

> new_f 
     date val change 
1 2012-01-01 22  NA 
2 2012-02-01 45  23 #(45-22) 
3 2012-03-01 67  22 #(67-45) 

我该如何计算这些变化值?

+1

尝试'C(NA,DIFF(F $ VAL))'' –

+1

F $变化< - C(NA,DIFF(F $ VAL))'? –

回答

4

随着dplyr,您还可以使用lag函数而不是diff。这有好处,它已经包含了NA

require(dplyr) 
f %>% mutate(change = val-lag(val)) 
##   date val change 
## 1 2012-01-01 22  NA 
## 2 2012-02-01 45  23 
## 3 2012-03-01 67  22 
2

您可以使用diff用于这一目的:

f$change <- c(NA, diff(f$val)) 
f 
##   date val change 
## 1 2012-01-01 22  NA 
## 2 2012-02-01 45  23 
## 3 2012-03-01 67  22 

由于diff 1缩短了输入向量,就可以在使用c()

+1

我不知道是否值得加入'library(data.table); setDT(f)[,change:= c(NA,val [-1] - val [ - 。N])]和 'library(dplyr); f%>%mutate(change = c(NA,val [-1] - val [-n()]))'为了好玩 –

+0

我最终使用了这种方法,但dplyr似乎也很好。然后影子声誉较低,所以我觉得我应该接受他的回答。没有冒犯的意思! –

+1

@til_b,没有冒犯。关于如何以及接受哪个答案,请参阅[本文的Meta](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。我不介意你接受影子的答案(这很好),但你不应该接受答案,因为有人的代表比别人低。如果你喜欢他们,你总是可以得到几个答案。 –

1

开始与NA串连它如果您确信您的日期是独一无二的,已经订购:

f$change = c(NA, tail(f$val,-1)-head(f$val,-1))