我在理解传递的引用属性方面遇到了一些麻烦data.table.有些操作似乎"打破"了参考,我想准确理解发生了什么.
在data.table从另一个创建a 时data.table(通过<-,然后更新新表:=,原始表也会被更改.这是预期的,按照:
?data.table::copy
和stackoverflow:传递引用操作在数据表包中
这是一个例子:
library(data.table)
DT <- data.table(a=c(1,2), b=c(11,12))
print(DT)
# a b
# [1,] 1 11
# [2,] 2 12
newDT <- DT # reference, not copy
newDT[1, a := 100] # modify new DT
print(DT) # DT is modified too.
# a b
# [1,] 100 11
# [2,] 2 12
Run Code Online (Sandbox Code Playgroud)
但是,如果我:=在<-赋值和:=上面的行之间插入非基础修改,DT现在不再修改:
DT = data.table(a=c(1,2), b=c(11,12))
newDT …Run Code Online (Sandbox Code Playgroud) 我只想在的组的第一行中分配这些值data.table。
例如(简体):my data.tableis DTwith the following content
x v
1 1
2 2
2 3
3 4
3 5
3 6
Run Code Online (Sandbox Code Playgroud)
的key的DT是x。
我想讲一组的每一行。
这工作正常:DT[, .SD[1], by=x]
x v
1 1
2 2
3 4
Run Code Online (Sandbox Code Playgroud)
现在,我想只分配的这些值v来0。
但这都不起作用:
DT[, .SD[1], by=x]$v <- 0
DT[, .SD[1], by=x]$v := 0
DT[, .SD[1], by=x, v:=0]
Run Code Online (Sandbox Code Playgroud)
我从程序包和提供的所有链接中搜索了R-help,但我无法使其正常运行。
我发现那里的注释说这行不通,但是没有示例/解决方案可以帮助我。
任何建议我都会很高兴。
(我非常喜欢这个程序包,我不想回到data.frame ...在这里工作)
编辑:
我想要这样的结果:
x v
1 0
2 0
2 3 …Run Code Online (Sandbox Code Playgroud)