2017-02-10 62 views
0

问题的两个部分:查找索引编号

Q1

说我有这样的载体:以

y1 <- c(1:4,3,4:7,5,8:15) 
y1 
[1] 1 2 3 4 3 4 5 6 7 5 8 9 10 11 12 13 14 15 

我想从这个向量中提取一个连续数字的向量,从最小的数字开始。对于y1这里我期待这样的:

y_result=1:15 
y_result 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

我想使用is.unsorted()但到目前为止,我的技能是失败了我。这是我迄今的尝试。子集向量:

while (is.unsorted(y1) == TRUE) { 
    y1 <- y1[which(diff(y1) > 0)] 
} 
y1 
[1] 1 2 3 4 5 5 8 9 10 11 12 13 

这确实的确产生了一个未排序的向量。然而,那令人讨厌的五人正在造成各种各样的破坏。我看到我的diff()方法是如何解决问题的,但我不知道如何纠正它。为了清楚起见,我想提取连续的数字,放下任何不符合要求的数字。

Q2

对于上述提取,如何将一个提取原始数据而不是原始值的索引值。所以,在这个例子中,我一直在寻找的回报:

>extract_function() 
1,2,3,4,7,8,9,11,12,13,14,15,16,17,18 

的这里的想法是,我可以使用这些索引数字从原来的数据帧或向量中提取数据。我无法使用match%in%,因为它会返回多个条件匹配的情况。在下面的例子中,讨厌的5个重新出现因为y2比赛5〜5二者在df1$y1

df1=data.frame(y1=c(1:4,3,4:7,5,8:15), res=rnorm(y1)) 
    y2=df1$y1 


    while (is.unsorted(y2, strictly=TRUE) == TRUE) { 
    y2 <- y2[which(diff(y2) > 0)] 
    } 

    df1[df1$y1 %in% y2,] 

    y1   res 
1 1 -0.24592395 
2 2 -1.23183844 
3 3 0.39394734 
4 4 0.53695526 
5 3 -1.76993425 
6 4 0.14429303 
7 5 -0.01816061 
10 5 -0.83691178 
11 8 0.27537953 
12 9 -0.61817703 
13 10 -2.17678870 
14 11 -0.74117904 
15 12 -0.70320352 
+0

难道不是'Q1基本上和你以前的问题一样:[向量中最长有序部分的第一个索引](http://stackoverflow.com/questions/42077448/first-index-of-longest-ordered-portion-of-a -向量) (有一个很好的接受答案)? – Henrik

+0

类似的答案,但对于某些应用程序来说,这种方法过于激进。我还需要一个可以删除小块非增长数据的选项。虽然找到了以前的答案,但是非常全面。 – boshek

回答

2

这是一种使用累加减少先找到索引,则该值的溶液中。

consec <- function(x) { 
    idx <- unique(Reduce(function(p,i) if(x[i] == x[p]+1) i else p, seq_along(x), acc=TRUE)) 
    list(idx=idx, val=x[idx]) 
} 

这是通过保持连续最后条目的索引值的轨道,只有当一个新的连续编号来更新它。因此,我们必须筛选最终答案的唯一索引。

随着例子,

consec(c(1:4,3,4:7,5,8:15)) 

$idx 
[1] 1 2 3 4 7 8 9 11 12 13 14 15 16 17 18 

$val 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 

如果你不是说连续(如为1的整数差),而是严格递增,然后

ord <- function(x) { 
    idx <- unique(Reduce(function(p,i) if(x[i] > x[p]) i else p, seq_along(x), acc=TRUE)) 
    list(idx=idx, val=x[idx]) 
} 


ord(y1) 

$idx 
[1] 1 2 3 4 7 8 9 11 12 13 14 15 16 17 18 

$val 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 


y2 <- c(1.097, 1.101, 1.12, 1.12, 1.12, 1.151, 1.201, 1.245, 1.293, 1.379, 
     1.482, 1.555, 1.616, 1.669, 1.719, 1.78, 1.842, 1.91, 1.949, 1.959,  
     1.955, 1.939, 1.911, 1.899, 1.903, 1.908, 1.922, 1.918, 1.907, 1.893, 
     1.88, 1.877, 1.884, 1.895, 1.903, 1.914, 1.917, 1.913, 1.905, 1.9) 

ord(y2) 

$idx 
[1] 1 2 3 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 

$val 
[1] 1.097 1.101 1.120 1.151 1.201 1.245 1.293 1.379 1.482 1.555 1.616 1.669 
[13] 1.719 1.780 1.842 1.910 1.949 1.959 
+0

我喜欢这种方法 - 但它似乎分崩离析,像这样的一个向量:'y2 < - c(1.097,1.101,1.12,1.12,1.12,1.151,1.201,1.245,1.1。293, 1.379,1.482,1.555,1.616,1.69,1.719,1.78,1.842,1.91,1.994,1.959,1.955,1.939,1.911,1.899,1.903,1.908,1.922,1.918,1.907,1.893,1.88,1.877,1.884 ,1.895,1.903,1.914,1.917,1.913,1.905,1.9); consec(Y2)'。我试图分开为什么,但我想现在我会分享这个。 – boshek

+1

我觉得你不是指*连续*但可能*严格增加*?查看编辑,它们是否与'y2'上的预期输出相匹配?现在关于这个问题的具体问题是否已被您接受的答案覆盖了您以前的相关问题? –

+0

是的,我绊倒了自己与连续与增加。这很好。相关问题帮助我找到了第一个递增序列的第一个索引。然后这个函数将允许我在第一个索引之后“清理”数据。我正在尝试开发一种小型算法,以满足矢量在不丢失太多数据的情况下增加的要求。 – boshek