用内置函数重新表示此R函数?

用内置函数重新表示此R函数?,r,vectorization,R,Vectorization,假设我们在[i,j]中有一系列前哨值(称之为y1)和一个值向量i:j(称之为y2)。例如: y1 <- c(649, 652, 656, 658, 660, 661, 669, 671) y2 <- 649:671 y1更有效的功能实现是: y1[findInterval(y2, y1, rightmost.closed=TRUE)+1] 使用示例数据: y1 <- c(649, 652, 656, 658, 660, 661, 669, 671) y2 <- 64

假设我们在
[i,j]
中有一系列前哨值(称之为
y1
)和一个值向量
i:j
(称之为
y2
)。例如:

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

y1更有效的功能实现是:

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

y1更有效的功能实现是:

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

y1
mycut
mycut请解释此函数的作用。你可以用Rcpp来实现它(这在这里很简单)。@Roland:是的,这就是我现在正在做的(但是如果社区知道一种使用内置函数来表达这一点的方法,我宁愿使用它)你的意思是
y1[findInterval(y2,y1,最右边的.closed=TRUE)+1]
?@jogo:我不知道'findInterval'。谢谢请解释这个函数的作用。你可以用Rcpp来实现它(这在这里很简单)。@Roland:是的,这就是我现在正在做的(但是如果社区知道一种使用内置函数来表达这一点的方法,我宁愿使用它)你的意思是
y1[findInterval(y2,y1,最右边的.closed=TRUE)+1]
?@jogo:我不知道'findInterval'。谢谢好吧,也许矢量化不是正确的表达。我的意思是用更高效的内置函数(如cut)进行分解。这一个似乎更快(哨兵值已排序)。好吧,也许矢量化不是正确的表达式。我的意思是用更高效的内置函数(比如cut)进行分解。这一个看起来更快(哨兵值被排序)。
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