以正确的方式添加到列

时间:2019-04-19 14:27:53

标签: r datatable

我有一个简单的DT,我想在其余部分添加一列。代码如下:(有效)

x <- data.table(a=1:5,b=5:1,c=rep(999,5))
for(k in c("a","b")){x[,k] <- x[,..k]+x[,.(c)]}

现在是一个问题:为什么我必须使用..进行分配?另外,如果我在第一种情况下尝试使用..,即

for(k in c("a","b")){x[,..k] <- x[,..k]+x[,.(c)]}

存在错误:“未找到[...]对象'..k'”。看起来很奇怪,我必须在范围内更改语法。

现在在dataframe中,等效公式非常清楚:

for(k in c("a","b")){x[,k] <- x[,k]+x[,c]} # error with DT
x <- data.frame(a=1:5,b=5:1,c=rep(999,5))
for(k in c("a","b")){x[,k] <- x[,k]+x[,"c"]} # works with dataframe

所以我想知道(1)上面的代码是否是在datatable中执行此操作的正确方法(请解释一下..运算符,数据表FAQ 1.1并未特别针对此问题) ;如果是(2),则可以使用其他更简洁的方式编写。感谢您的提示。

1 个答案:

答案 0 :(得分:1)

来自官方introducion(针对您的示例进行了稍微编辑):

  

对于熟悉Unix终端的人,..前缀应为   让人联想到“上一级”命令,类似于   这是怎么回事– ..信号发送到data.table以查找   k个变量“上一级”,即在循环环境中   在这种情况下。

因此,此运算符转义数据帧,并在更高级别中查找k变量,获取该值并返回。不知道为什么会这样,但是可能变量没有被传输。

您还可以使用with参数:

x[,k,with=FALSE]


编辑:

我刚刚检查了data.table的源代码。它们从parent.frame()获取被调用的变量,因此调用了获取函数的环境。这是由..with参数触发的。因此,如果您不使用它,该函数将无法获取环境的参数。

发现关于parent.frame()的问题here