调试if语句

时间:2015-12-06 23:50:11

标签: r if-statement for-loop

我试图理解r中的for和if语句,所以我运行一个代码,我说如果行的总和大于3则返回1,否则为0: 这是代码

     set.seed(2)
     x = rnorm(20)
     y = 2*x
     a = cbind(x,y)
     hold = c()

现在来了if语句

     for (i in nrow(a)) {
     if ([i,1]+ [i,2] > 3) hold[i,] == 1
     else ([i,1]+ [i,2]) <- hold[i,] == 0
     return (cbind(a,hold)
    }

我知道可能合并,如果可能不理想,但我只是想了解出了什么问题。请保持虚拟级别的解释:)谢谢

3 个答案:

答案 0 :(得分:3)

您遇到了一些问题。 @mnel提供了一个更好的方法来实现这一目标,我将专注于理解这次尝试出了什么问题(但不要这样做,使用矢量化溶液)。

第1行

for (i in nrow(a)) { 
  • a有20行。 nrow(a)为20.因此,您的代码相当于for (i in 20),这意味着i只会是20。

修复:

for (i in 1:nrow(a)) {

第2行

if ([i,1]+ [i,2] > 3) hold[i,] == 1
  • [i,1]不是什么,它是i行和第一列......没有。您需要引用您的数据:a[i,1]

  • 您已将hold初始化为向量c(),因此它只有一个维度,而不是行和列。因此,我们要分配给hold[i],而不是hold[i,]

  • ==用于进行相等性测试。 =<-用于转让。现在,如果符合>3条件,则检查hold[i,]是否等于1。 (并且不对结果做任何事情)。

修复:

if (a[i,1]+ a[i,2] > 3) hold[i] <- 1

第3行

else ([i,1]+ [i,2]) <- hold[i,] == 0
  • 如上所述,分配与平等测试。 (这里你使用箭头分配,但把它放在错误的地方 - 好像你正试图分配给其他人一样)

  • 每当else条件未满足时,
  • if就会发生,您不需要尝试重复该条件

修正:

else hold[i] <- 0

固定代码:

for (i in 1:nrow(a)) {
    if (a[i,1] + a[i,2] > 3) hold[i] <- 1
    else hold[i] <- 0
}

您并没有使用花括号作为if和else表达式。对于单行表达式,它们不是 required (如果有的话就是这一行)。它们是多行所必需的(如果有什么东西可以做),但我认为它们是一个好主意。另外,在R中,将else}中的if放在同一行上(在for循环内部或功能它并不重要,但除此之外它会,所以养成一直做这件事的习惯是好事。我会推荐这个重新格式化的代码:

for (i in 1:nrow(a)) {
    if (a[i, 1] + a[i, 2] > 3) {
        hold[i] <- 1
    } else {
        hold[i] <- 0
    }
}

使用ifelse

ifelse()是R中的向量化if-else语句。当您想要测试条件向量并为每个条件得到结果时,它是合适的。在这种情况下,您可以像这样使用它:

hold <- ifelse(a[, 1] + a[, 2] > 3, 1, 0)

ifelse会照顾你的循环。如果您希望将其作为数据中的列,请直接指定(无需先初始化)

a$hold <- ifelse(a[, 1] + a[, 2] > 3, 1, 0)

答案 1 :(得分:2)

  1. R中的此类操作很好地被矢量化。
  2. 您未通过拨打[(例如a[i,1]
  3. 列出了您希望编入索引的数据集的引用

    使用rowSums

    h <- rowSums(a) > 3
    

答案 2 :(得分:0)

我将假设你是R的新手,并试图了解for循环本身的基本功能。 R具有称为“应用”功能的奇特函数,专门用于对数据帧的每一行进行基本数学运算。我不打算谈论这些。

您希望在数组的每一行上执行以下操作。

  1. 对行的元素求和。
  2. 测试总和大于3。
  3. 返回值1或0,表示结果为2。
  4. 对于1,幸运的是“sum”是built in function。在每种编程语言中检查内置函数是值得的,因为它们可以节省您的时间。要汇总行的元素,只需使用sum(a[row_number,])

    对于2,您正在评估逻辑语句“是x&gt; 3?”其中x是1的结果。“&gt; 3”语句返回值true或false。逻辑表达式是一个花哨的“if then”语句,没有“if then”。

    > 4>3
    [1] TRUE
    > 2>3
    [1] FALSE
    

    对于3,真值或假值是R中称为“逻辑”值的数据结构.1或0值是R中称为“数值”值的数据结构。通过将“逻辑”转换为“数字”,您可以将TRUE更改为1,将FALSE更改为0。

    > class(4>3)
    [1] "logical"
    > as.numeric(4>3)
    [1] 1
    > class(as.numeric(4>3))
    [1] "numeric" 
    

    for循环有一个min,max,一个计数器和一个可执行文件。计数器从最小值开始,然后递增,直到达到最大值。可执行文件将在每次运行计数器时运行。您从第一行开始,然后转到最后一行。将所有元素放在一起就像这样。

    for (i in 1:nrow(a)){
      hold[i] <- as.numeric(sum(a[i,])>3)
    }