假设我有一个向量
x <- c(300, 320, 342, 355, 399, 453, 500, 532, 2, 3, 4, 5, 100, 300, 500, 550, 2, 3)
如您所见,它的值有些增加,然后值减小,然后又增加,依此类推。
发现第一个下降的点是值532,然后是值2.因此,在这一点上,我想将值2加到532,所以我现在有534,然后将值3加到534。值4,然后值5,依此类推。
所以,我累加了第一次最大出现后的值532。
所以,我的结果将是:
300, 320, 342, 355, 399, 453, 500, 532, 534, 537, 541, 546, 646, 964, 1446, 1996, 1998 , 2001
我正在尝试:
MY_FUNC <- function(Values)
{
Values <- Values[!is.na(Values)]
max_val = 0
index = 0;
for (i in 1:length(Values))
{
if (Values[i] > max_val)
{
max_val = Values[i]
index = i;
#break when first occurence found
}
}
new_vec <- Values[index] + cumsum(Values[(index + 1):length(Values)])
new_vec
}
x <- c(300, 320, 342, 355, 399, 453, 500, 532, 2, 3, 4, 5, 100, 300, 500, 550, 2, 3)
MY_FUNC(x)
但是我不知道如何找到循环的第一个最大出现和中断。
答案 0 :(得分:4)
我们可以使用diff
和which.max
查找第一个值下降,然后将该点之前的值与该点之后的cumsum
个值连接在一起。
first_drop <- which.max(diff(x) < 0)
c(x[1:(first_drop - 1)], cumsum(x[first_drop:length(x)]))
#[1] 300 320 342 355 399 453 500 532 534 537 541 546 646 946 1446 1996
#[17] 1998 2001
如果需要,我们可以在函数中编写
MY_FUNC <- function(x) {
first_drop <- which.max(diff(x) < 0)
c(x[1:(first_drop - 1)], cumsum(x[first_drop:length(x)]))
}
MY_FUNC(x)
# [1] 300 320 342 355 399 453 500 532 534 537 541 546 646 946 1446
#[16] 1996 1998 2001