我有一个矢量化问题,我似乎无法在线找到解决方案。我有一个非常大的数据框,目前我正在使用以下循环来过滤和获取滞后值:
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)。大多数在线示例显示了如何仅对行本身进行过滤,而不是如何根据条件获取滞后值。有谁知道如何解决这个问题?谢谢!