2017-02-10 63 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