【问题标题】:for-loop statement understandingfor循环语句理解
【发布时间】:2016-04-04 19:53:43
【问题描述】:

我可能有一个愚蠢的问题,但我就是无法理解其背后的逻辑。

     Question 1:
     a = c(10,20,30)
     b = c(15,30,45)
     c = cbind(a,b)
     for ( i in 1:ncol(c))
          {d[i] = c[i]+2}

     print(d)
     # Error d not defined

然后我想也许我需要一个占位符来代表这个问题,所以我做了以下事情:

        Question 2: 
        d = matrix(NA, 3,2) # now have the same dimension as c         
        for ( i in 1:ncol(c)){d[i] = c[i]+2}

输出是

           [,1] [,2]
      [1,]   12   NA
      [2,]   22   NA
      [3,]   NA   NA

我无法解释上述输出。我不明白为什么我在第 3 行得到 NA。

我也尝试了以下方法:

      for ( i in 1:ncol(c)){d[,i] = c[,i]+2}

然后我得到了正确的答案,但是当我尝试以下操作时出现错误:

      Question 3: 
      for ( i in 1:ncol(c)){d[i] = c[,i]+2}
      Warning messages:
      1: In d[i] = c[, i] + 2 :
         number of items to replace is not a multiple of replacement length
      2: In d[i] = c[, i] + 2 :
         number of items to replace is not a multiple of replacement length

我知道我已经问了很多问题,但如果你能回答他们一个傻瓜,我将不胜感激。

【问题讨论】:

  • c() 是一个函数。通常,将其他内容分配给 c 是不好的做法
  • 第一季度未定义
  • 我认为我无法帮助解决这个问题,因为您的帖子在很大程度上取决于之前运行的代码。 (正如@42 在答案中所说)。如果您仍然感到困惑,请重新启动您的 R 会话,然后一行一行地运行代码。从干净的 R 会话开始很重要,这样事情就可以重现。我也认为如果你从一个目标开始会更好,而不仅仅是一些令人困惑的代码。代码的目标是什么?让我们研究如何完成目标,而不是如何理解破碎的事物。
  • @Gregor 感谢您的回复,但我一一运行代码并找到了答案。请参阅下面的答案。

标签: r for-loop


【解决方案1】:

如果您的工作区中没有d,它将返回一个错误,因为通过索引分配给尚未定义的对象是……未定义。如果您将d 定义为一个空的数字向量,您会得到:

d <- numeric(0)
      for ( i in 1:ncol(c))
           {d[i] = c[i]+2}

      print(d)
#[1] "12.00" "22.00"  # since `c` at that point was a two column matrix but c[1] and c[2]
                      # are just single values because of the way matrix indexing works.

所以我们真的不知道“为什么”,在你的情况下,这是结果,但我们知道d 已经在你的工作空间内,并且可能是一个尺寸为 3x2 的矩阵。

您似乎混淆了数据帧的索引和矩阵的索引。如果 M 是矩阵,则 M[1] 是与 M[1,1] 相同的第一个元素,这与如果 D 是数据帧则 D[1] 是第一列的整体的情况相反,可能是一个非常长向量,不像 D[1,1] 和 M[1,1] 的长度为 1。还有一个潜在的混淆(你还没有展示出来),R 的新手在数据帧上使用“长度”,而不是返回行数,而是只看到列数。

【讨论】:

    【解决方案2】:

    我知道回答您自己的问题是一种不好的做法,但我认为经过广泛搜索后我可以给出一个非常愚蠢的答案。

           Question 1: 
           As previous mentioned this will give an error as followings: 
           #Error in d[i] = c[i] + 2 : object 'd' not found
    

    为什么? 因为“d”不存在,所以当c[i]等于1时,即为10,加2为12。结果不能放在“d”处,因为“d”不存在即未定义.要解决这个问题,你需要定义“d”,这就是我在问题2中所做的。定义意味着在运行for循环语句之前你需要创建一个可以存储结果的空位置,这不是这里的情况,因此 R 将产生错误。

           Question 2:
           d = matrix(NA, 3,2) # now have the same dimension as c         
           for ( i in 1:ncol(c)){d[i] = c[i]+2} 
           #[1] 12 22 NA NA NA NA
    

    为什么?这里 1:ncol(c) 等于 1 & 2,因为只有 2 列 a&b。当 c[1] 等于 10 时,c[2] 等于 20。这是索引而不是列。换句话说,列“a”包含 (10,20,30),但 c[1] 是列“a”的第一个元素,即 10,而 c[2] 是第二个元素,即 20,依此类推。这与 c[,1] 不同(查看 1 之前的逗号),它将为您提供列“a”的向量,即 (10,20,30)。代码将按以下方式工作:

            when i is equal to 1 then c will be equal to 10
            the first element of matrix d will be equal to 
            d[1] = 10 +2 
            d = 12 continuing.... now i = 2
            d[2] = 20 +2
            d= 22
    

    由于我只有第 1 列和第 2 列,即“i”只能是 1 和 2,剩余的输出将为 NA。

           Question 3: 
           for ( i in 1:ncol(c)){d[i] = c[,i]+2}
           #Warning messages:
           # 1: In d[i] = c[, i] + 2 :
             #number of items to replace is not a multiple of replacement length
           #2: In d[i] = c[, i] + 2 :
             #number of items to replace is not a multiple of replacement length
           #[1] 12 17 NA NA NA NA 
    

    这里的主要问题是 c[,i] 将获取第 1 列和第 2 列的元素,但 d[i] 是索引,即当 "i" = 1 时,d[i] 将是第一个元素并且由于我们只有 2 列,因此其余的答案将是 NA。看看它是如何工作的,让我们看一下代码

         when i is equal to 1 then c[,1] = 10
         d[i] = 10 +2 = 12
         The result 12 will be placed in the first element of matrix d
         when i is equal to 2 then c[,2] = 15
         d[i] = 15+2 = 17
         The result 17 will be placed in the second element of the matrix d
    

    所以输出将如下所示:

                   [,1] [,2]
             [1,]   12   NA
             [2,]   17   NA
             [3,]   NA   NA   
    

    还要注意数字 17 的位置。这是第 2 列的第一个元素的结果,但它被放置在矩阵 d 的第二个元素中。这是非常危险的。

    【讨论】:

    • 回答自己的问题实际上是一个好习惯:stackoverflow.com/help/self-answer>
    猜你喜欢
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多