【问题标题】:using variable i in data.table row index在 data.table 行索引中使用变量 i
【发布时间】:2014-11-14 09:29:22
【问题描述】:

我对在 for 循环中使用数据表有疑问。这是代码和错误。

警告消息意味着我得到了错误的答案,只使用了 56184.97 的第一个数字。 当我使用 K 索引时它有效,当我索引时它不起作用。

找到答案:data.table 不喜欢 [i,j,by] 中“i”列中的变量“i”。

> len<-dim(dd)[1]
> for(i in 1:3) {
+   k<-i
+   cat("i is:", i,"\n")
+   cat("k is:", k,"\n")
+   cat(dd[i:len,savg],"\n")
+   cat(dd[k:len,savg],"\n")  
+ }
i is: 1 
k is: 1 
56184.97 53838.91 51527.4 49264.21 47063.1 44937.83 
56184.97 53838.91 51527.4 49264.21 47063.1 44937.83 
i is: 2 
k is: 2 
56184.97 53838.91 51527.4 49264.21 47063.1 44937.83 
53838.91 51527.4 49264.21 47063.1 44937.83 
i is: 3 
k is: 3 
56184.97 53838.91 51527.4 49264.21 47063.1 44937.83 
51527.4 49264.21 47063.1 44937.83 
Warning messages:
1: In i:len : numerical expression has 6 elements: only the first used
2: In i:len : numerical expression has 6 elements: only the first used
3: In i:len : numerical expression has 6 elements: only the first used

【问题讨论】:

    标签: r indexing data.table


    【解决方案1】:

    您混淆了局部变量和全局变量。这是一个复制您的问题的简单示例:

    dt = data.table(a = 1:5)
    
    a = 2
    dt[a:5]
    #   a
    #1: 1
    #2: 2
    #3: 3
    #4: 4
    #5: 5
    #Warning message:
    #In a:5 : numerical expression has 5 elements: only the first used
    

    发生的事情是i-expression 是在data.table 内计算的,其中a=1:5 而不是2,所以上面的表达式等价于:

    dt[(1:5):5]
    

    解决方案是对变量名更加小心,并更加了解它们的范围。绝对确定data.table 不会使用列名的一种方法是在第一个参数中给出一个变量,而不是一个表达式(FAQ 中提到了这一点):

    a = 2:5
    dt[a]
    #   a
    #1: 2
    #2: 3
    #3: 4
    #4: 5
    

    【讨论】:

      【解决方案2】:

      不是答案,我建议您举一个数据表的示例,但我没有收到以下示例数据表的警告,这正是您正在做的事情。

      savg = c(1,2,3,4,5 ) 
      y = c(2,3,3,1,1 ) 
      z = c(4,3,2,1,1 )
      
      dd<-data.table(savg,y,z)
      len<-dim(dd)[1]
      
      for(i in 1:3){
          cat(dd[i:len, savg], "\n")
      }
      
      #1 2 3 4 5
      #2 3 4 5
      #3 4 5
      

      【讨论】:

        猜你喜欢
        • 2023-03-13
        • 2012-02-01
        • 2016-03-14
        • 1970-01-01
        • 2019-11-27
        • 1970-01-01
        • 2013-07-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多