在 R 中,在相同的 data.frame 上关闭 data.table 的自动更新?

In R, turn off automatic update by data.table on identical data.frame?

(在 )

的延续

基本上,我有

idx <- c(1397, 2000, 3409, 3415, 4077, 4445, 5021, 5155) 

idy <- c( 1397, 2000, 2860, 3029, 3415, 3707, 4077, 4445, 5021, 5155, 
         5251, 5560)

agex <- c(NA, NA, NA, 35, NA, 62, 35, 46)

agey <- c( 3, 45,  0, 89,  7,  2, 13, 24, 58,  8,  3, 45)

然后我将它们每个都放在一个 data.frame 中并制作这些数据帧的副本

  dat1 <- as.data.frame(cbind(idx, agex))
  dat1copy <- dat1
  dat2 <- as.data.frame(cbind(idy, agey))
  dat2copy <- dat2

并且我想检查是否对于所有情况 idy=idxagex=NA,如果是,那么 agey 也应该设置为 NA(这应该只发生在 dat2,而不是 dat2copy,它应该在 NA 传输中保持不变)

然而之后,

    library(data.table)
    setDT(dat1)
    setDT(dat2)
   dat2[dat1[is.na(agex)], on=.(idy = idx), agey := NA]

dat2copy 也更新了,并且在与更新的 dat2 相同的位置也有 NA。我能做些什么来防止这种双重更新,或者我如何存储原始 dat2 的副本?

要确保 dat2copy 在转换为 data.table 后与 dat2 不同,请使用 data.table copy 函数:

library(data.table)

dat1 <- data.frame(idx, agex)
dat2 <- data.frame(idy, agey)

# wrong - same addresses
dat2copy <- dat2
address(dat2) == address(dat2copy)
## [1] TRUE

# correct - different addresses but equal contents
dat2copy <- copy(dat2)
address(dat2) == address(dat2copy)
## [1] FALSE
identical(dat2, dat2copy)
## [1] TRUE

setDT(dat1)
setDT(dat2)
dat2[dat1[is.na(agex)], on=.(idy = idx), agey := NA]

identical(dat2, dat2copy)
## [1] FALSE