我试图获取一个范围内的数字列的重要值.我不知道如何开始这个,任何人都有任何想法?
data<-data.frame(lower=c(1,4,6,7,7),upper=c(3,5,7,8,9),importantval=c(99,98,97,96,95))
vals<-c(1.14,3.5,7.2,19)
> data
lower upper importantval
1 1 3 99
2 4 5 98
3 6 7 97
4 7 8 96
5 7 9 95
输出目标
# 1.14 99
# 3.5 NA
# 7.2 96 <--return the smalller interval (from 7 to 8 is smaller than 7 to 9)
# 19 NA <--doesnt exist so return NA
最佳答案 一个简单的lapply就可以了.识别线路相对容易.当多个值有效时,if语句只采用较小的间隔有点难以理解,但大多数情况下,如果存在多种可能性,我会将行间隔等于可能的最小间隔.
foo <- function(i) {
res <- data[data$lower < i & data$upper > i, ]
if (nrow(res) > 1) {
res <- res[which(res$upper - res$lower == min(res$upper - res$lower)), ]
}
if (nrow(res) == 0) return(NA)
return(res$importantval)
}
results <- data.frame(vals, sapply(vals, foo))
这假设没有相同长度的间隔.如果有可能,您可以在末尾添加return(min(res $importantval))以仅获得较小的值.
如果您想要保留两个值,请将结果放在列表中:
results <- lapply(vals, foo)
names(results) <- vals