【问题标题】:Confused about if statement and for loop in R对R中的if语句和for循环感到困惑
【发布时间】:2016-11-11 05:16:55
【问题描述】:

所以我在 R 中有一个数据框,其中一列是几个因素的变量,我想为每个因素创建一些虚拟变量,但是当我编写一个循环来执行此操作时,我得到一个错误。

因此,例如,如果列由各种因素 a、b、c 组成,并且我想为每个因素编写一个 1 或 0 的虚拟变量,我必须创建一个的代码是:

h = rep(0, nrow(data))
for (i in 1:nrow(data)) {
  if (data[,1] == "a") {
    h[i] = 1
  } else {
    h[i] = 0
  }
}
cbind(data, h)

这给了我错误消息“条件的长度 > 1,并且只使用第一个元素”我在本网站的其他地方看到说我应该尝试编写自己的函数来解决问题并避免 for 循环而且我真的不明白a)如何通过编写函数(至少立即)来解决这个问题b)将其作为函数而不是循环的好处。

我最后还使用 ifelse 语句创建每个向量,然后 cbind 将其添加到数据框中,但我们非常感谢您的解释。

【问题讨论】:

标签: r if-statement for-loop dataframe


【解决方案1】:

if (data[,1] == "a") { 更改为if (data[i,1] == "a") {

【讨论】:

    【解决方案2】:

    Aakash 正确地指出了循环中的问题。你的测试是

    if (data[,1] == "a")
    

    由于您的测试不依赖于i,因此每次迭代都相同。你可以像这样修复你的循环:

    h = rep(0, nrow(data))
    for (i in 1:nrow(data)) {
      if (data[i, 1] == "a")
        h[i] = 1
      } else {
        h[i] = 0
      }
    }
    

    我们甚至可以简化,因为 h 被初始化为 0,所以在 else 的情况下不需要将其设置为 0,我们可以继续:

    for (i in 1:nrow(data)) {
      if (data[i, 1] == "a")
        h[i] = 1
      }
    }
    

    更实质性的改进是引入矢量化。这将加快您的代码速度,并且一旦您掌握了它,通常更容易编写。 if 只能检查单个条件,但 ifelse 是向量化的,它将获取一个测试向量、一个“if true”结果向量、一个“if false”结果向量,并将它们组合起来:

    h = ifelse(data[, 1] == "a", 1, 0)
    

    这样,语句之前就不需要初始化h了,我们可以直接添加到数据框里:

    data$h = ifelse(data[, 1] == "a", 1, 0)
    

    在这种情况下,您的测试用例和结果非常简单,我们可以做得更好。

    data[, 1] == "a" ## run this and look at the output
    

    上面的代码只是TRUEFALSE 的布尔向量。如果我们在其上运行as.numeric(),TRUE 值将被强制为 1,FALSE 值将被强制为 0。所以我们可以这样做

    data$h = as.numeric(data[, 1] == "a")
    

    这将比ifelse 更有效。

    这个操作非常简单,写一个函数来做没有任何好处。

    【讨论】:

    • 感谢您的帮助,非常感谢!令人惊讶的是有多少不同的方法可以做同样的事情哈哈。
    猜你喜欢
    • 2011-01-24
    • 2016-07-13
    • 2017-05-03
    • 1970-01-01
    • 2020-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多