観測データ フレームの外れ値を検出するためにルックアップを実行しようとしています。ルックアップ データ フレーム df_ref はかなり小さく (約 50 行)、観測データ フレームは約 200,000 行です。次のコードは、サンプル データと私のアプローチを説明しています。
df_ref = data.frame(id = c(2, 7, 12), ref = c(15, 27, 32))
df_obs = data.frame(obs = rep(11, 4), val = c(3, 4, 7, 13))
ルックアップは次のロジックに基づいています (データは df_ref.
if val >= 2 and val < 7 then ref = 15
if val >= 7 and val < 12 then ref = 27
if val >= 12 then ref = 32
df_val の val と df_ref の (id, ref) を使用して、上記のロジックに基づいて決定された df_obs に列 ref_val を追加したいと考えています。
次の R 関数はルックアップを正しく行います
get_ref = function(x, df_ref) {
df_ref[df_ref$id == max(df_ref$id[x >= df_ref$id]), "val"]
}
この関数を df_obs で使用すると、
mutate(df_obs, ref=get_ref(val, df_ref))
I get the following error:
obs val
1 11 3
2 11 4
3 11 7
4 11 13
Warning message:
In x >= df_ref$id :
longer object length is not a multiple of shorter object length
最終的な出力は次のようになります
df_obs
obs val ref
1 11 3 15
2 11 4 15
3 11 7 27
4 11 13 32
ここで何が間違っていますか?そして、このルックアップを達成するためのより良い R っぽい方法は何でしょうか? 助けてください。
よろしく
K