2015-06-10 3 views
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.

Благодаря

ответ

9

Одной из возможностей была бы найти кумулятивные максимумы вектор, а затем извлекать уникальные элементы:

unique(cummax(a)) 
# [1] 2 5 6 8 
+0

ОК, это круто, именно то, что я искал, спасибо! – clemlaflemme

1

Другой ответ лучше, но я сделал эту итеративную функцию, которая также работает. Он работает, делая все последовательные различия> 0

increasing <- function (input_vec) { 
     while(!all(diff(input_vec) > 0)){ 
      input_vec <- input_vec[c(1,diff(input_vec))>0] 
     } 
     input_vec 
    } 
Смежные вопросы