gpt4 book ai didi

R:是否有等价于 diff(x) 的除法?

转载 作者:行者123 更新时间:2023-12-01 09:16:22 25 4
gpt4 key购买 nike

我正在处理财务数据的数据框,我想在其中获取行之间的差异,以及行之间的“更改”。对于不同之处,任务很简单,只需:

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.frame(c(1,2,4,15),c(2,1,5,8))

data

上面我自己的代码片段的输出(也是预期的):

output

最佳答案

我不知道一个基本的 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))

关于R:是否有等价于 diff(x) 的除法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35200269/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com