首页 > 解决方案 > 如何在 j 运算符 (:=) 中使用通过引用链接来影响基础表

问题描述

我在这里有以下一段代码作为测试

library(data.table)
set.seed(1)
dt <- data.table::data.table(letters = sample(LETTERS,200,replace = TRUE),numbers = sample(1:1000,200,replace = TRUE))
sortcols <- c("letters","numbers")
setkeyv(dt,sortcols)
dt
#         letters numbers
#  1:       A     258
#  2:       A     400
#  3:       A     429
#  4:       A     496
#  5:       B      72
# ---                
#196:       Z     142
#197:       Z     462
#198:       Z     583
#199:       Z     665
#200:       Z     954
dt[letters=="A"][,numbers := numbers/2]
dt2 <- dt[letters=="A"][,numbers := numbers/2]

dt[letters=="A"]
#       letters numbers
#1:       A     258
#2:       A     400
#3:       A     429
#4:       A     496


dt2
#       letters numbers
#1:       A   129.0
#2:       A   200.0
#3:       A   214.5
#4:       A   248.0

我想在这里理解的是

  1. 为什么按引用运算符 := 在这里使用喜欢

dt[letters=="A"][,numbers := numbers/2]

不影响基础数据表 dt(并且所有字母 =="A" 的数字列保持不变),而当我将其复制为 dt2 时,它会反映在复制的结果中(即 dt2 中的数字列所有字母==“A”都被除以 2,这是代码的初衷)。引用运算符 := 的功能不是影响底层数据表而不进行复制吗?

  1. 是否可以不复制数据表并仍然使用链接和 := 来完成我想要完成的任务?

标签: rdata.table

解决方案


推荐阅读