for循环语句理解

时间:2016-04-04 19:53:44

标签: r for-loop

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

     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

我知道我已经问了很多问题,但是如果你能为一个假人回答它们,我会非常感激。

2 个答案:

答案 0 :(得分: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]不同,长度为1,M [1,1]。还有一个潜在的混淆(你还没有展示)R的新手在数据框上使用“长度”,而不是返回行数,而是只看到列数。

答案 1 :(得分:0)

我知道回答你自己的问题是一个不好的做法,但我想我可以在广泛搜索后给出一个非常虚拟的答案。

       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-loop语句之前你需要创建一个空的地方来存储结果,这不是这里的情况,因此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&amp; 2,因为只有2列a&amp; 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列和第1列2即“i”只能是1&amp; 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的第二个元素中。这非常危险。