从行中找到最大值,然后相减前一个数

  • 本文关键字:一个 相减 然后 最大值 r
  • 更新时间 :
  • 英文 :


例如:

v1 <- c(10, 11, 20, 30, 40, 50, 30, 25, 20, 10)

v1中,50是一个最大值,我需要下面的结果

result <- c(0, 0, 0, 0, 0, (50/40)-1, (30/50)-1, (25/30)-1, (20/25)-1, (10/20)-1)

最终的数组看起来像这样

c(0, 0, 0, 0, 0, 0.25, -0.4, -0.16, -0.2, -0.5)

这是一个利用data.table::shift()

的方法
f <- function(v) {
mx = which.max(v); 
c(rep(0,mx-1), (v/shift(v)-1)[mx:length(v)])
}

用法:

f(v1)
输出:

[1]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.2500000 -0.4000000 -0.1666667 -0.2000000 -0.5000000

在Base R中我们将做:

idx <- which.max(v1)
index <- seq_along(v1) >= idx - 1
c(numeric(idx - 1), tail(v1[index],-1)/head(v1[index], -1) - 1)
[1]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.2500000 -0.4000000
[8] -0.1666667 -0.2000000 -0.5000000

我们也可以这样做

library(dplyr)
replace((v1/lag(v1))-1, seq_along(v1) < which.max(v1), 0)

与产出

[1]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.2500000 -0.4000000 -0.1666667 -0.2000000 -0.5000000

你可以用下面的方法来完成这个,有点笨拙,使用base R的which.max()dplyrlag()函数的组合和一些索引:

c(rep(0,which.max(v1) - 1), v1[which.max(v1):length(v1)] / (dplyr::lag(v1[(which.max(v1)-1):length(v1)]))[-1]-1)

输出:

#[1]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.2500000 -0.4000000 -0.1666667 -0.2000000
#[10] -0.5000000

将其分解为更合适的代码:

numerator <- v1[which.max(v1):length(v1)]
denominator <- lag(v1[(which.max(v1) - 1):length(v1)])[-1]
leading_zeros <- rep(0, which.max(v1) - 1)
c(leading_zeros, numerator/denominator - 1)
#[1]  0.0000000  0.0000000  0.0000000  0.0000000  0.0000000  0.2500000 -0.4000000 -0.1666667 -0.2000000
#[10] -0.5000000

最新更新