[英]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.