2016-04-05 12 views
0

[i,j]y1と呼ぶ)と値i:jのベクトル(y2と呼ぶ)の一連のセンチネル値があるとします。たとえば:このR関数を組み込み関数で再表現しますか?

y1 <- c(649, 652, 656, 658, 660, 661, 669, 671) 
y2 <- 649:671 

それとも

y1 <- c(719, 725, 726, 728, 729, 731, 734, 740) 
y2 <- 718:740 

ありませんが、この機能を考えてみます。

Cody5 <- function(y1, y2){ 
    y3 <- rep(NA, length(y2)) 
    j <- 1 
    i <- 0 
    while(j < length(y1)){ 
     i <- i + 1 
     if(y2[i]<y1[j]){ 
      y3[i]<-y1[j] 
     } else { 
      y3[i]<-y1[j<-j+1] 

     } 
    } 
    if(i < length(y3)){ 
     for(l in i:length(y3)){ 
      y3[l] <- y1[j] 
     } 
    } 
    y3 
} 

私はcut()を使用してCody5を交換しようとしているが、私はそれが正しいように見えることはできません。

編集:

私はそれを書いておく必要があります。番兵(y1)と元のベクトルのエントリがにソートされています。

+0

この機能が何をするのか説明してください。あなたはRcppでこれを実装することができます(これは簡単です)。 – Roland

+0

@Roland:はい、それは[Rccp it]が今やっていることです(しかし、コミュニティが組み込み関数を使ってこれを表現する方法を知っているなら、私はむしろそれを使用したい) – user189035

+1

'y1 [findInterval (y2、y1、rightmost.closed = TRUE)+1] '? – jogo

答えて

2

あなたの機能のより効率的な実装は次のようになります。例えば、データと

y1[findInterval(y2, y1, rightmost.closed=TRUE)+1] 

y1 <- c(649, 652, 656, 658, 660, 661, 669, 671) 
y2 <- 649:671 
Cody5(y1, y2) 
# [1] 652 652 652 656 656 656 656 658 658 660 660 661 669 669 669 669 669 669 669 669 671 671 671 
y1[findInterval(y2, y1, rightmost.closed=TRUE)+1] 
# [1] 652 652 652 656 656 656 656 658 658 660 660 661 669 669 669 669 669 669 669 669 671 671 671 
+0

さて、ベクトル化は正しい表現ではないかもしれません。私は、より効率的な組み込み関数(カットなど)の観点から分解することを意味しました。 – user189035

+0

@ user189035私は自分の答えを編集しました。 – jogo

+0

これはより速く見えます(センチネル値*はソートされます)。 – user189035

3
mycut <- function(x, y) { 
    x[cut(y, c(-Inf, x), 
      labels = FALSE, right = FALSE, 
      include.lowest = TRUE)] 
} 

y1 <- c(649, 652, 656, 658, 660, 661, 669, 671) 
y2 <- 649:671 

all.equal(Cody5(y1,y2), 
      mycut(y1,y2)) 
#[1] TRUE 

y1 <- c(719, 725, 726, 728, 729, 731, 734, 740) 
y2 <- 718:740 

all.equal(Cody5(y1,y2), 
      mycut(y1,y2)) 
#[1] TRUE 
関連する問題