2016-08-07 8 views
2

'forloops'をベクトル化したものに置き換えることで、処理時間を短縮したいと考えています。ループの代わりにベクトル化するR

以下では、私がもっと大きなデータセットで行うことの簡単な例を示します。

df <- data.frame(time = c(10, 12, 14, 14, 14, 17, 23, 23, 30, 32), ranks = vector(mode = 'double', length = 10)) 

df_hilf <- data.frame(time_hilf = c(10, 12, 14, 17, 23, 30, 32), ranking_hilf = c(1, 2, 4, 6, 7.5, 9, 10)) 

for (j in 1:nrow(df_hilf)) { 
    df$ranks[df$time == df_hilf$time_hilf[j]] <- df_hilf$ranking_hilf[j] 
} 

私はdfというデータフレームを生成しました。このデータフレームは時間順に並べられています。目標は、別のデータフレーム(この例ではdf_hilf)のランクを初期データフレームに割り当てることです。

df_hilfでは、dfのユニークな時刻だけが格納されるため、データフレームの長さが異なります。

df_hilfに格納されたランクは、特定のルール(信頼性解析の調整されたランクを使用)によって計算されます。簡単にするために、私はこの例ではミッドランを使用しました。したがって、私は本当にdf_hilfに格納されたこの特定のランクを必要とします。

最後に、dfの同じ時刻の値に同じランクを付けたいとします。

> df 
    time ranks 
1 10 1.0 
2 12 2.0 
3 14 4.0 
4 14 4.0 
5 14 4.0 
6 17 6.0 
7 23 7.5 
8 23 7.5 
9 30 9.0 
10 32 10.0 

私はこれが機能replicateで仕事ができると思いますが、私は同じ時間値の出現も異なるため、n引数を設定する方法を発見していません。

残念ながら私はネット上でこの問題の解決策を見つけられませんでした。私は何か見落としてしまったことをお詫びします。

答えて

4

あなたはmatch()を使用することができます。

df$ranks <- df_hilf$ranking_hilf[match(df$time, df_hilf$time)] 
#> df 
# time ranks 
#1 10 1.0 
#2 12 2.0 
#3 14 4.0 
#4 14 4.0 
#5 14 4.0 
#6 17 6.0 
#7 23 7.5 
#8 23 7.5 
#9 30 9.0 
#10 32 10.0 
+1

おかげで、これは私が探していた機能です。 – Tim91

関連する問題