首页 > 解决方案 > 如何在有条件地定义向量的情况下提高循环的速度?

问题描述

我有以下代码块,我在 for 循环中创建一个向量,条件是其他向量和数据框。我正在迭代大约 15,000 次,并且需要大量运行此代码(100 次)。现在它非常慢,所以我试图让它更快。我意识到在循环的每次迭代中使用 which() 可能效率很低,但我不确定如何更改它。我曾想过使用 apply() 函数,但不确定它们是否有助于使事情变得更快。我也一直在考虑矢量化而不是运行 for 循环。非常感谢您的时间和提前的帮助!

这是一个示例数据框temp_dat

   MONTH             ID  E
1      9 19951100023401 32
2      7 19951100023401 32
3      9 19951100023402 34
4      7 19951100023402 34
5      9 19951100023403 32
6      7 19951100023403 32
7      9 19951100023903 90
8      7 19951100023903 79
9      9 19951100024403 34
10     7 19951100024403 34

我正在运行的代码是:

vector1 <- c()
x<- unique(temp_dat$ID)
for (a in 1:length(x)) {
  b = x[a]
  
  vector1[a] <- as.numeric(((temp_dat[which(temp_dat$ID == b & temp_dat$MONTH == 9),]$E %in% c(90,97)) & (temp_dat[which(temp_dat$ID == b & temp_dat$MONTH == 7),]$E %in% c(79,77))))
}

它具有作为输出向量1 的值

0 0 0 1 0

标签: rperformancefor-loopvectorization

解决方案


require(data.table)
temp_dat <- as.data.table(temp_dat)
temp_dat[,
         as.integer(
           any(MONTH == 9 & (E %in% c(90,97))) &&
             any(MONTH == 7 & (E %in% c(79,77)))
           ),
         by = ID]$V1

推荐阅读