我有一个包含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等
非常感谢你的帮助!
答案 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) })