我希望提取矢量的最长有序部分。例如,使用此向量:
x <- c(1,2,1,0.5,1,4,2,1:10)
x
[1] 1.0 2.0 1.0 0.5 1.0 4.0 2.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
我将应用一些函数,返回以下内容:
x_ord <- some_func(x)
x_ord
[1] 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0
我一直在尝试利用is.unsorted()
来确定向量不再排序的位置。这是我迄今为止的混乱尝试和我所拥有的:
for(i in 1:length(x)){
if( is.unsorted(x[i:length(x)])==TRUE ){
cat(i,"\n")}
else{x_ord=print(x[i])}
}
然而,由于x_ord
正在产生10
,这显然是不对的。我也希望能使这个更通用,并且在有序序列之后覆盖非增加数字以及类似这样的向量:
x2 <- c(1,2,1,0.5,1,4,2,1:10,2,3)
现在虽然我仍然坚持在所提到的第一个载体中识别增加的序列。
有什么想法吗?
答案 0 :(得分:3)
这似乎有效:
s = 1L + c(0L, which( x[-1L] < x[-length(x)] ), length(x))
w = which.max(diff(s))
x[s[w]:(s[w+1]-1L)]
# 1 2 3 4 5 6 7 8 9 10
s
是运行开始的地方,加上length(x)+1
,为方便起见:
length(x)+1
上进行操作,如果向量继续, diff(s)
是runs
的长度,而which.max
是第一个最大化,以打破关系。
s[w]
是所选跑步的开始; s[w+1L]
是下一次运行的开始;所以要获得属于所选运行的数字:s[w]:(s[w+1]-1L)
。
或者,拆分然后选择所需的子向量:
sp = split(x, cumsum(x < c(-Inf, x[-length(x)])))
sp[[which.max(lengths(sp))]]
# 1 2 3 4 5 6 7 8 9 10