首页 > 解决方案 > 意外列删除 - 创建 data.table 备份和删除 data.table 列的正确方法是什么

问题描述

当我以前删除列时,我总是会做类似的事情:

DT[, Tax:=NULL]

有时要进行备份,我会做类似的事情

DT2 <- DT

但就在前一秒发生了这样的事情:

library(data.table)
DT <- structure(list(Province = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 
3), Tax = c(2000, 3000, 1500, 3200, 2000, 1500, 4000, 2000, 2000, 
1000, 2000, 1500), year = c(2000, 2000, 2000, 2001, 2001, 2001, 
2002, 2002, 2002, 2003, 2003, 2003)), row.names = c(NA, -12L), class = c("tbl_df", 
"tbl", "data.frame"))

DT2 <- structure(list(Province = c(1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 
3), Tax = c(2000, 3000, 1500, 3200, 2000, 1500, 4000, 2000, 2000, 
1000, 2000, 1500), year = c(2000, 2000, 2000, 2001, 2001, 2001, 
2002, 2002, 2002, 2003, 2003, 2003)), row.names = c(NA, -12L), class = c("tbl_df", 
"tbl", "data.frame"))

setDT(DT) 
setDT(DT2)
DT2 <- DT

# Removes Tax in BOTH datasets !!
DT2[, Tax:=NULL]

在开始学习 data.table 时,我记得一些关于此的内容,但显然这并不是真正可取的(至少对我而言)。

在不意外删除列的情况下处理此问题的正确方法是什么?

标签: rdata.table

解决方案


(从评论中移动。)

由于data.table使用引用语义(就地,而不是像大多数 R 一样的写时复制),因此您的分配DT2 <- DT意味着两个变量都指向相同的数据。这是依赖就地工作的“内存高效操作”的陷阱之一:如果你搞砸了,你就会失去它。任何可以保护您免受此类错误的方法都将是内存效率低下的,保留一个(或多个)数据副本。

如果您需要DT2成为不同的数据集,请使用

DT2 <- copy(DT)

之后DT2[,Tax:=NULL]不会影响DT

我发现 MattDowle 的回答在这里提供了信息/帮助(尽管问题明确询问copy,而不仅仅是您提到的行为)。


推荐阅读