R获取上一行的百分比差异

时间:2018-06-13 16:06:26

标签: r diff lag

我有一个包含4列的数据集,第一列是日期,另外三列是数字。我试图获得这3个数字列的前一行的%diff。我知道已经有一些关于这类问题的帖子df %>% mutate_each(funs(. - lag(.))) %>% na.omit(),但大多数都不能关注日期,因为我希望日期不变,需要不同的日期。

这是数据集

date=c('2018-01-01', '2018-02-01', '2018-03-01')
a=c(1,3,2)
b=c(89,56,47)
c=c(1872,7222,2930)
x=data.frame(date,a,b,c)

我希望得到像这样的最终数据集

x=data.frame(date,a,b,c)
a=c(NA, 2, -0.333)
b=c(NA, -0.371, -0.161)
c=c(NA,2.857, -0.594)
x=data.frame(date,a,b,c)

表示对于col A,2 = 3 / 1-1,-0.333 = 2 / 3-1 对于col B,-0.371 = 56 / 89-1等

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:0)

使用包data.table的解决方案:

x = as.data.table(x)
cols = c("a", "b", "c")
x[,(paste0(cols, "_pctChange")) := lapply(.SD, function(col){ 
      (col-shift(col,1,type = "lag"))/shift(col,1,type = "lag")
  }), .SDcols=cols]

答案 1 :(得分:0)

quantmod包对于这个名为Delt()的函数来说非常有用。

您需要做的就是:

x[-1] <- sapply(x[-1], Delt)

我不确定你对sapply有多熟悉,但是如果你想访问Delt()的参数来调整你的计算,你可以尝试类似的东西:

x[-1] <- sapply(x[-1], function(x) { Delt(x, k=2) })