【问题标题】:How to improve speed of a loop where conditionally defining vector?如何在有条件地定义向量的情况下提高循环的速度?
【发布时间】:2021-09-26 02:11:04
【问题描述】:

我有以下代码块,我在 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

【问题讨论】:

  • 如果我们知道 temp_date 是什么以及您希望最终输出的样子会有所帮助
  • temp_dat 只是一个数据框。在输出方面,我将向量 vector1-3_final 用于循环之外的东西。
  • 请用示例输入和输出编辑问题,以便我们可以使用它
  • 阅读minimal reproducible example。不会要求您提供整个数据集,只要求提供足够的数据来进行一些测试并允许与您认为在使用该示例运行时应该得到的答案进行比较。并阅读edit。您似乎忽略了 cmets 关于您的问题如何违反在此处发布的规范。这就是让你投反对票的原因(而且没有答案。)
  • 好的,谢谢您的建议。我刚刚添加了一个带有所需输出的示例。如果我没有在帖子中正确分享数据框,我提前道歉。

标签: r performance for-loop vectorization


【解决方案1】:
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

【讨论】:

  • 非常感谢!我会尝试一下并测试性能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多