提取递增子序列
Extract an increasing subsequence
我希望从第一个元素开始提取向量的递增子序列。例如,从这个向量:
a = c(2, 5, 4, 0, 1, 6, 8, 7)
...我想 return:
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]
基本上我对输入向量进行排序并检查索引是否验证条件"no indices at the right hand side are lower",这意味着事先没有更大的值。
但是好像有点复杂,不知道有没有easier/quicker的解决方案,或者R里面有没有预建的函数。
谢谢
一种可能是找到向量的累积最大值,然后提取唯一元素:
unique(cummax(a))
# [1] 2 5 6 8
另一个答案更好,但我制作了这个同样有效的迭代函数。它的工作原理是使所有连续的差异 > 0
increasing <- function (input_vec) {
while(!all(diff(input_vec) > 0)){
input_vec <- input_vec[c(1,diff(input_vec))>0]
}
input_vec
}
我希望从第一个元素开始提取向量的递增子序列。例如,从这个向量:
a = c(2, 5, 4, 0, 1, 6, 8, 7)
...我想 return:
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]
基本上我对输入向量进行排序并检查索引是否验证条件"no indices at the right hand side are lower",这意味着事先没有更大的值。
但是好像有点复杂,不知道有没有easier/quicker的解决方案,或者R里面有没有预建的函数。
谢谢
一种可能是找到向量的累积最大值,然后提取唯一元素:
unique(cummax(a))
# [1] 2 5 6 8
另一个答案更好,但我制作了这个同样有效的迭代函数。它的工作原理是使所有连续的差异 > 0
increasing <- function (input_vec) {
while(!all(diff(input_vec) > 0)){
input_vec <- input_vec[c(1,diff(input_vec))>0]
}
input_vec
}