eval(expr,envir,enclos)中的错误:找不到对象

时间:2016-04-04 20:34:22

标签: r data.table

我正在尝试通过运行同一data.table中另一列的值来编辑data.table的列。但是,当我这样做时,我收到以下错误:Error in eval(expr, envir, enclos) : object 'y' not found。下面我简单介绍了在我自己的代码中发生这种情况的情况。

n = c(2, 3, 5) 
s = c("aa", "bb", "cc", "dd", "ee") 
b = c(TRUE, FALSE, TRUE, FALSE, FALSE) 
x = list(n, s, b, 3, c(n,s), b, 5)

DT <-  data.table(grp=c("a","a","b","b","b","c","c"), foo=1:7, bar=x, y=rep("", length(x)))

for (i in 1:nrow(DT)) {
  if (DT[grp[i]=="a"]) {
    DT[,y[i]:= c(x[[i]], x[[5]][i]]
  }
}

但是,显然y存在,因为我只需输入DT[,y],甚至DT[,y[7]]。为什么会这样?

编辑:实际代码比这个例子复杂得多;我觉得使用for循环的原因是因为,基于if语句的结果,我然后使用while语句来运行x[i+n]的值,添加所有的相关的x[i]y[i],直到达到停止条件。因此我觉得迭代元素很重要。

1 个答案:

答案 0 :(得分:3)

如果要替换data.table中的整个y列,请使用

DT[ , y:= x ]

如果要替换y列的子集,请在第一个&#34;插槽中指示子集&#34; [,]运算符:

DT[ i, y := x ] 

这可以通过逻辑测试完成,例如

DT[ grp=="a", y := bar ]

这不会完全重现您的问题,但我相信从这里很容易适应它。如果不是,请发表评论。

使用子集而不是循环具有更好的性能,并且对于R来说更具惯用性。

修改:您可以在?`:=`

的手册页上看到很多的示例,用例和差异:=和[&lt; - 语法