【问题标题】:If loop - Argument is of length zero - error如果循环 - 参数长度为零 - 错误
【发布时间】:2021-03-08 07:29:06
【问题描述】:

我确实有以下循环代码,它基本上只根据“RPK_cap”列是否高于外部给定的某个阈值来更新“衰减率”列(在场景 1 中为 1200 ,在场景 2 中为 1300 等)。如果是这样的话,我想通过将它乘以我的 0.9 来降低衰减率。这是针对 data.table 中的所有国家(列:iso)和年份(列:年份)完成的。当我使用场景 1 数据时,“RPK_cap”列将填充场景 1 数据,如果我选择场景 2,“RPK_cap”列将分别填充场景 2 数据。

我的问题如下: 此循环仅适用于场景 1。 如果我使用场景 2,我会收到错误消息: “如果 (price_el_int_aviation_RPK$RPK_Cap[price_el_int_aviation_RPK$iso == 时出错: 参数长度为零”

我确实尝试了很多,但我只是不知道问题出在哪里。有谁知道问题是什么? 这是数据表 data.table_example

  if (scenario == "1") {
    for (j in unique(price_el_int_aviation_RPK$iso)) {
      for (i in unique(price_el_int_aviation_RPK$year[price_el_int_aviation_RPK$iso == j])) { 
        if (price_el_int_aviation_RPK$RPK_cap[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year == i] > 1200) { 
          price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] <- price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] * 0.90  
        }
      }
    }
  } else if (scenario == "2"){ 
    for (j in unique(price_el_int_aviation_RPK$iso)) {
      for (i in unique(price_el_int_aviation_RPK$year[price_el_int_aviation_RPK$iso == j])) { 
        if (price_el_int_aviation_RPK$RPK_Cap[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year == i] > 1300) { 
          price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] <- price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] * 0.95
        }
      }
    }
  } else if (scenario == "3"){ 
    for (j in unique(price_el_int_aviation_RPK$iso)) {
      for (i in unique(price_el_int_aviation_RPK$year[price_el_int_aviation_RPK$iso == j])) { 
        if (price_el_int_aviation_RPK$RPK_Cap[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year == i] > 1400) { 
          price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] <- price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] * 0.95
        }
      }
    }
  } else if (scenario == "4"){ 
    for (j in unique(price_el_int_aviation_RPK$iso)) {
      for (i in unique(price_el_int_aviation_RPK$year[price_el_int_aviation_RPK$iso == j])) { 
        if (price_el_int_aviation_RPK$RPK_Cap[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year == i] > 1500) { 
          price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] <- price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] * 0.95
        }
      }
    }
  } else if (scenario == "5"){ 
    for (j in unique(price_el_int_aviation_RPK$iso)) {
      for (i in unique(price_el_int_aviation_RPK$year[price_el_int_aviation_RPK$iso == j])) { 
        if (price_el_int_aviation_RPK$RPK_Cap[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year == i] > 1600) { 
          price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] <- price_el_int_aviation_RPK$decay_rate[price_el_int_aviation_RPK$iso == j & price_el_int_aviation_RPK$year >= i] * 0.99
        }
      }
    }
  }else{}

【问题讨论】:

  • 您的示例不可重现,也不是最小的。请阅读minimal reproducible example
  • 请阅读How to make a great R reproducible example? 了解minimal reproducible example 在R 中的样子。编写一个好问题需要大量工作,但值得。一方面,你更有可能得到一个好的答案。另一方面,当你做出这样的努力时,你会学到很好的调试技能。
  • 为了澄清上述 cmets,将您的数据作为屏幕截图提供对我们没有帮助,因为我们无法使用屏幕截图在我们自己的系统上重现您的错误。您需要使用 dput(head(my data)) 之类的东西并将输出粘贴到您的问题中,以便我们可以复制该代码并运行您的循环。

标签: r loops for-loop if-statement data.table


【解决方案1】:

很难回答具体问题,因为我们看不到您的数据。

但是你看到的错误

 "Error in if (price_el_int_aviation_RPK$RPK_Cap[price_el_int_aviation_RPK$iso == : argument is of length zero"

是因为price_el_int_aviation_RPK$iso 的长度为零 - 它是一个没有任何内容的向量!

这是问题的一个最小示例

# Create a vector of length zero
a <- c()

# Prove it's length is zero
length(a)
# [1] 0

# This is a minimal example of what's going wrong with scenario 2 in your script
if(a == 2) { print("it works") }
Error in if (a == 2) if (a == 2) { : argument is of length zero

【讨论】:

  • 是的,但是当我使用 length(price_el_int_aviation_RPK$iso) 时,长度不是 0,而是 9624。我想我刚刚发现了问题:我必须用 by 插入“RPK_Cap”列的一些值使用函数 na.locf(x)。不知何故,循环不适用于这些数据。但奇怪的是它确实适用于场景 1,我也插入了这些值。
  • @Sebastian.DataAnalyst 在调试循环时,在出现错误后立即将迭代器输入控制台(例如,如果我有for(i in 1:10) ...,那么我只需输入i 并按回车键,即可准确查看它进行了哪个迭代。然后我忽略了循环,但是去循环中的第一行代码,然后运行它,然后是第二行,然后是第三行,依此类推,直到我发现行错误。然后检查一行代码和它的部分非常接近,直到你发现它有什么问题
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多