2017-09-27 8 views
0

このタイプのデータは、次のベクトルにあります。範囲内の2つのベクトルに一致する要素

v1 <- c(15, 20, 30, 45) 
v2 <- c(17, 23, 30, 55) 

彼らはv1の要素の特定の範囲内に収まる場合にのみ、各要素に一致したいです。私のコードは次のとおりです。

ifelse(v1>v2-5, match(v1, v2), 0) 

私の意図した出力は次のようになります。その代わり[1] 1 2 3 0

、私が取得:[1] NA NA 3 0

なぜ最初の2つの要素が一致していないですか?

答えて

1

第3の値は、と一致するv1の唯一の要素であるため、条件が満たされても他の要素にはNAが得られます。 ifelse()TRUE値に条件を返す要素に次の値を挿入します:

match(v1, v2)[v1 > v2 - 5] 
# [1] NA NA 3 

あなたが代わりにそこシーケンスを使用してみてください可能性があります

ifelse(v1 > v2 - 5, seq_along(v1), 0) 
# [1] 1 2 3 0 
1

はたぶん、あなたはfindIntervalを探しています。

findInterval(v1, c(0, v2)) 
#[1] 1 2 4 4 

結果の第三値が間違っているので、引数left.openTRUEに設定する必要があります。

findInterval(v1, c(0, v2), left.open = TRUE) 
#[1] 1 2 3 4 

ifelse(v1 > v2 - 5, findInterval(v1, c(0, v2), left.open = TRUE), 0) 
#[1] 1 2 3 0 
+0

二つのベクトルが正しい間隔与えられた異なる長さであった場合には、v1は、[2]、V2 [3]と一致してしまうと言うことができますので、どのように、私はそれを作ることができますか? –

+0

@ Raegan.H 2つのベクトルの長さが異なる場合は、 'v1'と' v2 - 5'と 'ifelse(v1> v2-5、... etc ...)'が警告を出します。これは 'match'にも当てはまり、問題を完全に変更します。 –

0
sapply(v1, function(x){ 
    temp = which(v2 >= x & abs(v2 - x) < 5)[1] 
    replace(temp, is.na(temp), 0) 
}) 
#[1] 1 2 3 0 
+1

私は、この答えに少しの文脈を追加すると便利だと思います。たとえば、OPの試みがうまくいかなかった理由は何ですか? –

関連する問題