在 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=idx,agex=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
(在
基本上,我有
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=idx,agex=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