【发布时间】:2019-04-19 14:27:53
【问题描述】:
我有一个简单的 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)]}
有一个错误:“[...]object '..k' not found”。这似乎很奇怪,我必须在范围内更改语法。
现在在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)有其他方法可以以更简洁的方式编写它。感谢您的任何提示。
【问题讨论】:
-
在
data.table中,x[,k]查找名为k的列,无论k是否在调用范围内都是变量。如果您定义k<-"a"并使用x[,k]您真的想要x[,"a"](如data.frame),您需要data.table中的x[,..k]。x[,k,with=FALSE]也可以在data.table中使用。 -
感谢@nicola 的解释。然而,这似乎只适用于循环中赋值的右侧,而不适用于左侧。
-
在
data.table中,您不会使用<-修改列,因此分配是data.frame方法。你使用:=(见?set)。例如在这里,你应该使用for(k in c("a","b")) x[,(k):=get(k)+c]。