假设我们在[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
)和原始矢量的条目已排序。
答案 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