用内置的方式重新表达这个R函数?

时间:2016-04-05 13:05:23

标签: r vectorization

假设我们在[i,j]中包含一系列标记值(称为y1)和值为i:j的向量(称之为y2)。例如:

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
}

我一直在尝试使用Cody5替换cut(),但我似乎无法做到正确。

编辑:

我应该写下它:标记值(y1)和原始矢量的条目已排序。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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