2015-01-06 65 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))