2017-01-11 9 views
1

バイナリ値で新しい列(df_one $ acceslane)を作成したいとします。 df_one$direction == df_two$direction場合とdf_one$locationdf_two$locationがほぼ同じであれば - それは1rのseqでネストされたforループを高速化

df_oneでなければなりません(>ループのネストされた中で距離を参照してください):

direction | location | acceslane  
L | 12.3 | NA 
R | 14.8 | NA 

df_two:

direction | location 
L | 12.5 
R | 145.0 

for (i in 1:nrow(df_one)) { 
    for (j in 1:nrow(df_two)) { 
    Distance <- seq(df_two[j, 2]-.5, df_two[j, 2]+.5, by = .1) 
    if ((x[i, 1] == df_two[j, 1]) & (x[i, 2] %in% Distance)){ 
     df_one[i, 3] <- 1 
     break} 
    else{df_one[i, 3] <- 0} 
    } 
} 

このコードは機能しますが、それほど高速ではありません。どうすればこれをスピードアップできますか?

あなたの例では、私のために実行されますが、私はあなたがローリングを行うために探していると思い参加していません
+0

Locationsを閉じるには、0.5境界内にあることを意味しますか、最初の10進数で同等にしますか? (L、12.3)と(L、12.45)は、アクセルレーン= 1と考えられるだろうか? – ab90hi

+0

@ ab90hiそれぞれの範囲が小数点以下5桁以下の場合は一致する必要があります。したがって、df_one $ location = 12.30とdf_two $ location = 12.79の場合は一致する必要があります。 df_two $ location = 12.79が12.81であれば、一致してはいけません。 – Arnand

+0

@Armans最初はローリングジョイントをしていないので、アイデアは良い考えではありません。コメントを整理する – Tensibai

答えて

5

library(data.table) 

df_one <- fread("direction | location  
      L | 12.3 
      L | 12.7 
      L | 13.1 
      R | 14.8 ", sep = "|") 
df_two <- fread("direction | location 
      L | 12.5 
      R | 145.0", sep = "|") 

df_one[, acceslane := 0] 
df_one[df_two, acceslane := 1, on = .(direction, location), roll = 0.5] 
df_one[df_two, acceslane := 1, on = .(direction, location), roll = -0.5] 
# direction location acceslane 
#1:   L  12.3   1 
#2:   L  12.7   1 
#3:   L  13.1   0 
#4:   R  14.8   0 

PS:小数の正確な比較に依存していないか、遅かれ早かれ、これを聞いてきます決してFAQ

+0

これは完璧に動作します! Muchos gracias – Arnand

+0

自分のデータでは動作しません。私はそれがdplyrを使い、私のdf_oneとdf_twoのクラスが "tbl_df" "tbl" "data.frame"であるからだと思います。これを "data.table" "data.frame"に変換する方法を知っていますか? – Arnand

+1

as.data.tableはジョブを実行する必要があります。 – Roland

関連する問題