2016-08-29 9 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 
関連する問題