向量的最长有序部分的第一个索引

时间:2017-02-06 21:20:48

标签: r indexing

我希望提取矢量的最长有序部分。例如,使用此向量:

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)

现在虽然我仍然坚持在所提到的第一个载体中识别增加的序列。

有什么想法吗?

1 个答案:

答案 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,为方便起见:

  • 第一次运行从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