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

时间:2018-10-26 12:04:44

标签: r dataframe data.table updating

(在 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的副本?

1 个答案:

答案 0 :(得分:1)

要确保将dat2copydat2转换为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