2016-08-29 2 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

5-4의 범위에는'vals'가 없을 때 왜 98 일치? –

+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 
관련 문제