2016-08-29 3 views
4

Я пытаюсь получить столбец importantval для числа, которое находится в пределах диапазона. Я понятия не имею, как начать это, у кого есть идеи?Найти строку, которая соответствует диапазону значений

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 
+4

Почему 98 соответствует, когда нет 'vals' в диапазоне от 4 до 5? –

+0

Это не опечатка в моем примере .... исправлена, спасибо! – Rilcon42

ответ

2

Простой 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 
Смежные вопросы