我想找到以前最大的串列。所以對于一個向量: 3, 2,2,3,4,3,9,5,2,3,4,6,120,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}
}
```
uj5u.com熱心網友回復:
這可以通過運行長度編碼來完成:
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
uj5u.com熱心網友回復:
也許另一個解決方案dplyr和tibble:
library(dplyr)
library(tibble)
cummax(vector) %>%
enframe() %>%
group_by(value) %>%
slice_head() %>%
pull(name)
[1] 1 5 7 13
uj5u.com熱心網友回復:
另一種方法是使用遞回函式
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))
uj5u.com熱心網友回復:
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()分組的第一個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/354161.html
上一篇:ggarrange-更改共享圖例的背景并洗掉圖之間的邊界
下一篇:如何在R中的所有列中減去不同的值
