随时间变化/绝对数字

Change over time / absolute numbers

我脑子里有一个结,试图为我的问题找到合适的搜索词。我相信这有一个非常简单的解决方案。

我有这样的数据:

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)

如何计算这些变化值?

您可以使用 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()

将其与NA连接起来

如果您确定您的日期是唯一的并且已经订购:

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

使用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