2

観測データ フレームの外れ値を検出するためにルックアップを実行しようとしています。ルックアップ データ フレーム 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

4

2 に答える 2

3

と比較するdf_obs$valdf_ref$id、R は長さが等しくなく、予期しないことをする可能性があることを警告します。つまり、短いベクトルをリサイクルします。

data.tables でローリング結合を行います。

library(data.table)
dt_ref <- data.table(df_ref, key = "id")
dt_obs <- data.table(df_obs, key = "val")

dt_ref[dt_obs, roll = TRUE]

#    id ref obs
# 1:  3  15  11
# 2:  4  15  11
# 3:  7  27  11
# 4: 13  32  11
于 2013-08-31T09:46:20.623 に答える