很慢For,if if if语句在R中

时间:2016-01-12 18:15:45

标签: r if-statement for-loop

我有一张非常大的桌子(n=2,723,860),我想从负风向(-180到180度)计算正风向(0到360度)。

我的一个循环,一个带有嵌套if和else if语句的for循环,需要永远运行(见下文)。

我是R的新手,我认为我没有这种结构有效。有关如何更好地构建它的任何帮助,以便它不需要这么长时间(目前在20分钟但仍未完成)?

for (j in 1:n){
  if (Jun012015$D[j] < 0){
   Jun012015$D1[j] <- (Jun012015$D[j] * (-1))
  } else if (Jun012015$D[j] > 0){
      Jun012015$D1[j] <- ((Jun012015$D[j] * (-1)) + 360)
  } else {
      Jun012015$D1[j] <- 0
  }
}

3 个答案:

答案 0 :(得分:7)

我希望docendo discimus决定重新开启他们的答案,因为它很好。以下是他们答案中的代码(如果他们重新打开他们,我将删除)

idx1 <- Jun012015$D < 0
idx2 <- Jun012015$D > 0
idx3 <- Jun012015$D == 0

Jun012015$D1[idx1] <- Jun012015$D[idx1] * (-1)
Jun012015$D1[idx2] <- (Jun012015$D[idx2] * (-1)) + 360
Jun012015$D1[idx3] <- 0

对于那些尚未掌握矢量化的人,我更喜欢这个答案。它的工作原理并不应该比我的慢得多(如下所示)。但我认为它更清楚地显示了这个过程,并且可以在未来帮助OP更多,这可能只是对于仍在使用for循环和if语句的人来说看起来像个谜。但这是我的单行应该完成它:

Jun012015$D*(-1) + 360*(Jun012015$D > 0)

您需要将其存储到变量中或用它覆盖Jun012015 $ D.

答案 1 :(得分:1)

我们也可以使用ifelse(但与@ Dason的解决方案相比,这会慢得多)。

with(Jun012015, ifelse(D1 < 0, D1 * -1, ifelse(D1 > 0, D1 * -1 +360, 0)))

或者@Dason建议,单个ifelse也适合

with(Jun012015, ifelse(D1 <=0, D1 * -1, D1 * -1 + 360))

为0 *(anynumber)= 0。

答案 2 :(得分:-2)

尝试使用ifelse而不是嵌套if else语句。

for(j in 1:n){
  ifelse(Jun012015$D[j] < 0, Jun012015$D[j]*(-1), 
         ifelse(Jun012015$D[j] > 0, (Jun012015$D[j] * (-1)) + 360, 0)
}

请提供您正在此循环运行的一些示例数据,以帮助提供基准答案。 apply函数系列总是比R中的循环更好。