4

我希望从第一个元素开始提取向量的增加子序列。例如,从这个向量:
a = c(2, 5, 4, 0, 1, 6, 8, 7)

...我想返回:
res = c(2, 5, 6, 8)

我以为我可以使用循环,但我想避免它。另一个尝试sort

a = c(2, 5, 4, 0, 1, 6, 8, 7)
ind = sort(a, index.return = TRUE)$ix
mat = (t(matrix(ind))[rep(1, length(ind)), ] - matrix(ind)[ , rep(1, length(ind))])
mat = ((mat*upper.tri(mat)) > 0) %*% rep(1, length(ind)) == (c(length(ind):1) - 1)
a[ind][mat]

基本上我对输入向量进行排序并检查索引是否验证了“右侧没有索引较低”的条件,这意味着事先没有更大的值。

但这似乎有点复杂,我想知道是否有更简单/更快的解决方案,或者 R 中的预构建函数。

谢谢

4

2 回答 2

10

一种可能性是找到向量的累积最大值,然后提取唯一元素:

unique(cummax(a))
# [1] 2 5 6 8
于 2015-06-10T08:27:36.810 回答
1

另一个答案更好,但我做了这个迭代函数也可以。它通过使所有连续差异> 0来工作

  increasing <- function (input_vec) {
      while(!all(diff(input_vec) > 0)){
          input_vec <- input_vec[c(1,diff(input_vec))>0]
      }
      input_vec
  }
于 2015-06-10T08:34:15.967 回答