随时间变化/绝对数字
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
我脑子里有一个结,试图为我的问题找到合适的搜索词。我相信这有一个非常简单的解决方案。
我有这样的数据:
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()
如果您确定您的日期是唯一的并且已经订购:
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