按向量R的顺序查找以前的最大值的列表



我想找到以前最大值的列表。因此,对于向量:3,2,2,3,4,3,9,5,2,3,4,6120,1第一个最大值为3,第二个最大值是4(因为,4>3(,然后是9(因为9>4(,再然后是120(120>9(因此,作为输出,我需要这个位置:1,5,7,13

有没有办法在没有for循环的情况下做到这一点?

```
vector<-c(3, 2,2,3,4,3,9,5,2,3,4,6,120,1)
results<-1
max<-3
for(i in 2:length(vector)){
if(vector[i]>max{
results<-c(results, i)
max<-vector[i]}
else {next}
}
```

这可以通过运行长度编码来完成:

vec <- c(3,2,2,3,4,3,9,5,2,3,4,6,120,1)
r <- rle(cummax(vec))
c(1, 1+cumsum(r$lengths)[-length(r$lengths)])
# [1]  1  5  7 13

还有一个来自@user20650的更短、更简洁的变体(谢谢!(:

which(as.logical(c(1, diff(cummax(vec)))))
# [1]  1  5  7 13

也许还有dplyrtibble的另一个解决方案:

library(dplyr)
library(tibble)
cummax(vector) %>%
enframe() %>%
group_by(value) %>%
slice_head() %>%
pull(name)
[1]  1  5  7 13

另一种方法是使用递归函数

findAllMaximums <- function(data, index = 1, results = c()){
if(index == length(data)) return(results)
if(index==1) return(findAllMaximums(data, index + 1, index))
if(data[index] > max(data[results])) results = append(results, index)
return(findAllMaximums(data, index + 1, results))
}
vector<-c(3, 2,2,3,4,3,9,5,2,3,4,6,120,1)
print(findAllMaximums(vector))
sapply(split(1:length(vector), cummax(vector)), `[`, 1)
##  3   4   9 120  <- the names of the result vector (=max values)
##  1   5   7  13  <- the values (=indexes)

只取cummax()分组的第一个。

最新更新