2016-04-05 3 views
0

Angenommen, wir haben eine Reihe von Sentinel-Werten in [i,j] einschließlich (nennen Sie sie y1) und einen Vektor der Werte i:j (nennen Sie es y2). Zum Beispiel:Re-express diese R-Funktion in Bezug auf eingebaute?

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

Oder

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

Keine dieser Funktion berücksichtigen:

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 
} 

Ich habe versucht, Cody5 mit cut() zu ersetzen, aber ich kann nicht scheinen, richtig zu machen.

Edit:

ich es geschrieben haben sollte: die Sentinel-Werte (y1) und die Einträge des ursprünglichen Vektors sind sortiert.

+0

Bitte erklären, was diese Funktion tut. Sie können es immer mit Rcpp implementieren (was hier trivial wäre). – Roland

+0

@Roland: Ja, das [Rccp it] ist das, was ich gerade mache (aber wenn die Community einen Weg kennt, dies mit eingebauter Funktion auszudrücken, würde ich das lieber verwenden) – user189035

+1

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

Antwort

2

Eine effizientere Implementierung Ihrer Funktion ist:

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

mit Beispieldaten:

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

Ok, vielleicht vektorisieren ist nicht der richtige Ausdruck. Ich meinte, in Bezug auf effizientere eingebaute Funktionen (wie zum Beispiel Schnitt) zu zerlegen. – user189035

+0

@ user189035 Ich habe meine Antwort bearbeitet. – jogo

+0

Dieser scheint schneller zu sein (die Sentinel-Werte * sind * sortiert). – 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