R:是否有一个与diff(x)相等的除法?

R:是否有一个与diff(x)相等的除法?,r,diff,R,Diff,我正在处理金融数据的数据帧,其中我希望获得行之间的差异,以及行之间的“更改”。不同之处在于,任务很简单: apply(df, MARGIN=2, FUN=function(x) diff(x)) 我的问题发生在我想要改变而不是改变的时候。也就是说,在数据帧的每一列中,我想迭代地取该列的下一个元素除以上一个元素,然后减去一个。我快速而肮脏的做法如下: apply(df, MARGIN=2, FUN=function(x) x[2:length(x)]/x[1:length(x)-1]-1) 但

我正在处理金融数据的数据帧,其中我希望获得行之间的差异,以及行之间的“更改”。不同之处在于,任务很简单:

apply(df, MARGIN=2, FUN=function(x) diff(x))
我的问题发生在我想要改变而不是改变的时候。也就是说,在数据帧的每一列中,我想迭代地取该列的下一个元素除以上一个元素,然后减去一个。我快速而肮脏的做法如下:

apply(df, MARGIN=2, FUN=function(x) x[2:length(x)]/x[1:length(x)-1]-1)
但是我想知道是否有一个函数可以帮我做到这一点

编辑:可根据要求复制的小型文件:


data我不知道一个基本的R函数能做到这一点,但是在外部包中有不同的
lag
/
lead
函数。例如,您可以这样使用
dplyr

> mutate_each(head(iris[-5]), funs(./lag(.)-1))
#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#1           NA          NA           NA          NA
#2  -0.03921569 -0.14285714   0.00000000           0
#3  -0.04081633  0.06666667  -0.07142857           0
#4  -0.02127660 -0.03125000   0.15384615           0
#5   0.08695652  0.16129032  -0.06666667           0
#6   0.08000000  0.08333333   0.21428571           1
与您自己的功能相比:

> apply(head(iris[-5]), MARGIN=2, FUN=function(x) x[2:length(x)]/x[1:length(x)-1]-1)
#  Sepal.Length Sepal.Width Petal.Length Petal.Width
#2  -0.03921569 -0.14285714   0.00000000           0
#3  -0.04081633  0.06666667  -0.07142857           0
#4  -0.02127660 -0.03125000   0.15384615           0
#5   0.08695652  0.16129032  -0.06666667           0
#6   0.08000000  0.08333333   0.21428571           1
您可以将其放在自定义函数中并使用:

f <- function(., n = 1L, default = NA) ./dplyr::lag(., n = n, default = default) -1
mutate_each(head(iris[-5]), funs(f))

f这里有一个从
data.table

library(data.table)
as.data.table(head(iris))[, lapply(.SD, function(x) 
                  x/shift(x)-1), .SDcols=1:4]
#   Sepal.Length Sepal.Width Petal.Length Petal.Width
#1:           NA          NA           NA          NA
#2:  -0.03921569 -0.14285714   0.00000000           0
#3:  -0.04081633  0.06666667  -0.07142857           0
#4:  -0.02127660 -0.03125000   0.15384615           0
#5:   0.08695652  0.16129032  -0.06666667           0
#6:   0.08000000  0.08333333   0.21428571           1

这里有一些方法。第一个返回数据帧,第二个返回矩阵,最后一个返回zoo对象。前两个不使用任何包

> data[-1,] / data[-nrow(data), ] - 1
  c.1..2..4..15. c.2..1..5..8.
2           1.00          -0.5
3           1.00           4.0
4           2.75           0.6

> exp(diff(log(as.matrix(data)))) - 1
     c.1..2..4..15. c.2..1..5..8.
[1,]           1.00          -0.5
[2,]           1.00           4.0
[3,]           2.75           0.6

> library(zoo)
> diff(as.zoo(data), arithmetic = FALSE) - 1
  c.1..2..4..15. c.2..1..5..8.
2           1.00          -0.5
3           1.00           4.0
4           2.75           0.6

使用日志转换
exp(diff(log(x)))-1)

最简单的方法是:

x <- c(10, 20, 30, 40, 50)
x/lag(x)

# [1] NA 2.000000 1.500000 1.333333 1.250000
x
x <- c(10, 20, 30, 40, 50)
x/lag(x)

# [1] NA 2.000000 1.500000 1.333333 1.250000