ベクトル化に関する質問がありますが、オンラインで解決策が見つからないようです。非常に大きなデータフレームがあり、現在、次のループを使用してフィルタリングしてラグ値を取得しています:
rowtype <-c('A','B','A','A','B','B','B','B','A','B','B','A','B','A','B','B','A','A');
values1<-c(2,1,8,5,-4,6,42,10,20,5,7,8,-2,8,9,3,2,5);
index<-seq(1:length(values1));
df<-data.frame(rowtype, values1, index);
mininumBsize <- 2;
df$firstBLagged<-0;
df$secondBLagged<-0;
df$thirdBLagged<-0;
for (idx in which(df$rowtype=='A') )
{
#get the past 5 lagged values of type 'B' that exceed a threshold
laggedValues <- rev(df[df$rowtype=='B' & df$values1 > mininumBsize & df$index < idx,]$values1)[1:5];
#take out any NA values here
laggedValues[is.na(laggedValues)]<-0;
#store those lagged values back into the dataframe
df$firstBLagged[idx]<-laggedValues[1];
df$secondBLagged[idx]<-laggedValues[2];
df$thirdBLagged[idx]<-laggedValues[3];
}
データフレームの出力は次のようになります。
> df
rowtype values1 index firstBLagged secondBLagged thirdBLagged
1 A 2 1 0 0 0
2 B 1 2 0 0 0
3 A 8 3 0 0 0
4 A 5 4 0 0 0
5 B -4 5 0 0 0
6 B 6 6 0 0 0
7 B 42 7 0 0 0
8 B 10 8 0 0 0
9 A 20 9 10 42 6
10 B 5 10 0 0 0
11 B 7 11 0 0 0
12 A 8 12 7 5 10
13 B -2 13 0 0 0
14 A 8 14 7 5 10
15 B 9 15 0 0 0
16 B 3 16 0 0 0
17 A 2 17 3 9 7
18 A 5 18 3 9 7
基本的に、タイプ「A」の行ごとに、特定のしきい値「mininumBsize」を超えるタイプ「B」の過去 5 つの値を取得したいと考えています。次に、データフレームの df$firstBlagged などに保存して、後で回帰やその他の分析に使用できるようにします。
残念ながら、このコードは実行に時間がかかりすぎます (また、R をより適切に記述する方法も理解したいと考えています)。オンラインの例のほとんどは、行自体のみをフィルタリングする方法を示していますが、条件に基づいて遅延値を取得する方法は示していません。この問題を解決する方法を知っている人はいますか?ありがとう!