我正在尝试通过运行同一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]
,直到达到停止条件。因此我觉得迭代元素很重要。
答案 0 :(得分:3)
如果要替换data.table中的整个y
列,请使用
DT[ , y:= x ]
如果要替换y
列的子集,请在第一个&#34;插槽中指示子集&#34; [,]运算符:
DT[ i, y := x ]
这可以通过逻辑测试完成,例如
DT[ grp=="a", y := bar ]
这不会完全重现您的问题,但我相信从这里很容易适应它。如果不是,请发表评论。
使用子集而不是循环具有更好的性能,并且对于R来说更具惯用性。
修改:您可以在?`:=`