繁体   English   中英

两行之间的差除以前一行

[英]Difference between two rows divided by the previous row

我已经能够找到每列连续两行之间的差异,但是现在我需要将其除以上一行。

Date    FXDL.AED.USD    FXDL.ALL.USD
03/01/2005  3.6726  92.1
04/01/2005  3.6726  92.1
05/01/2005  3.6725  94.5
06/01/2005  3.6726  95.1
07/01/2005  3.6725  95.3

例如,每列的(第2行-第1行)/第1行然后(第3行-第2行)/第2行之间的差等。

我已经使用diff_fxdl_weekdays <- sapply(fxdl_weekdays[,sapply(fxdl_weekdays, is.numeric)], diff)来找到差异,然后尝试将其除以-nrow但这没有用。

一种想法是使用dplyr包和lag函数,

library(dplyr)

#define the function
fun1 <- function(x){ (x - lag(x))/lag(x)}

mutate_if(df, is.numeric, fun1)
#        Date  FXDL.AED.USD FXDL.ALL.USD
#1 03/01/2005            NA           NA
#2 04/01/2005  0.000000e+00  0.000000000
#3 05/01/2005 -2.722867e-05  0.026058632
#4 06/01/2005  2.722941e-05  0.006349206
#5 07/01/2005 -2.722867e-05  0.002103049

如果您还想保留原始列,那么简单地,

mutate_if(df, is.numeric, funs('diff' = fun1))
#        Date FXDL.AED.USD FXDL.ALL.USD FXDL.AED.USD_diff FXDL.ALL.USD_diff
#1 03/01/2005       3.6726         92.1                NA                NA
#2 04/01/2005       3.6726         92.1      0.000000e+00       0.000000000
#3 05/01/2005       3.6725         94.5     -2.722867e-05       0.026058632
#4 06/01/2005       3.6726         95.1      2.722941e-05       0.006349206
#5 07/01/2005       3.6725         95.3     -2.722867e-05       0.002103049

创建一个函数:

f <- function(x) c(NA,(tail(x,-1) - head(x,-1))/head(x,-1))

将其应用于数字列:

sapply(d[,sapply(d, is.numeric)], f)

如果要将其添加到数据框中:

# replace the numeric columns with the new ones:
d[, sapply(d, is.numeric)] <- sapply(d[,sapply(d, is.numeric)], f)
# add new colums to the dataframe:
d[, paste0(names(d)[sapply(d, is.numeric)],'_diff')] <- sapply(d[,sapply(d, is.numeric)], f)

后者的结果:

> d
        Date FXDL.AED.USD FXDL.ALL.USD FXDL.AED.USD_diff FXDL.ALL.USD_diff
1 2005-01-03       3.6726         92.1                NA                NA
2 2005-01-04       3.6726         92.1      0.000000e+00       0.000000000
3 2005-01-05       3.6725         94.5     -2.722867e-05       0.026058632
4 2005-01-06       3.6726         95.1      2.722941e-05       0.006349206
5 2005-01-07       3.6725         95.3     -2.722867e-05       0.002103049

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM