(在 Conditional Replacing with NA in R (two dataframes)的延续)
所以基本上,我有
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的副本?
答案 0 :(得分:1)
要确保将dat2copy
与dat2
转换为data.table之后,请使用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