R 以正确的方式添加到列
我有一个简单的DT,我想在其余部分添加一列。代码如下:(工程) 出现错误:“[…]对象“…k”未找到”。这似乎很奇怪,我必须在范围内更改语法 现在在R 以正确的方式添加到列,r,datatable,R,Datatable,我有一个简单的DT,我想在其余部分添加一列。代码如下:(工程) 出现错误:“[…]对象“…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"]}
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
for(k in c(“a”,“b”){x[,k]来自官方(为您的示例略加编辑):
对于熟悉Unix终端的用户,应使用..前缀
让人想起“上一级”命令,它类似于
这里发生了什么–向data.table发送..信号以查找
k变量“上一级”,即循环环境中
在这种情况下
所以这个操作符转义数据帧,在一个更高的级别上查找k变量,获取值并返回。不确定他们为什么这样做,但可能变量没有被传输
您还可以使用with参数:
x[,k,with=FALSE]
编辑:
我刚刚检查了data.table的源代码。它们从parent.frame()
获取被调用的变量,因此调用函数的环境。这是由。
或带有参数的触发的。因此,如果不使用它,函数将无法获取环境的参数
有关parent.frame()
的问题,请参见data.table
,x[,k]
查找名为k
的列,无论k
是否是调用范围内的变量。如果定义k,请感谢@nicola的解释。但是,这似乎仅适用于循环中赋值的右侧,而不适用于左侧。在data.table
中,不使用修改列谢谢,这清楚地说明了它是如何工作的。只有一件事:你知道为什么会这样:for(k in c(“a”,“b”){x[,k]@Talik3233不抱歉。源代码中的注释暗示开发人员知道这一点。以下内容也可能完全错误:我认为区别在于编写变量。当您将变量分配到数据帧时,您必须以某种方式保存它。我认为临时空间内部发生了一些事情。但我不能确切地告诉您w帽子。这只是我从线索和错误消息中想到的。总之:如果你想读或写你的数据表,这是不同的。谢谢,所以这个问题是有道理的。毕竟,很高兴知道:)它不适用于左侧,因为这是一个data.frame
方法,在data.table
中,你可以更改columns通过引用:=
。
for(k in c("a","b")){x[,..k] <- x[,..k]+x[,.(c)]}
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