r - 意外列删除 - 创建 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 时,我记得一些关于此的内容,但显然这并不是真正可取的(至少对我而言)。
在不意外删除列的情况下处理此问题的正确方法是什么?
解决方案
(从评论中移动。)
由于data.table
使用引用语义(就地,而不是像大多数 R 一样的写时复制),因此您的分配DT2 <- DT
意味着两个变量都指向相同的数据。这是依赖就地工作的“内存高效操作”的陷阱之一:如果你搞砸了,你就会失去它。任何可以保护您免受此类错误的方法都将是内存效率低下的,保留一个(或多个)数据副本。
如果您需要DT2
成为不同的数据集,请使用
DT2 <- copy(DT)
之后DT2[,Tax:=NULL]
不会影响DT
。
我发现 MattDowle 的回答在这里提供了信息/帮助(尽管问题明确询问copy
,而不仅仅是您提到的行为)。
推荐阅读
- vue.js - Vuex - 计算属性“searchPhrase”已分配给但它没有设置器
- android - RelativeLayout 中的 Android 重力中心不像 LinearLayout 那样工作
- arrays - 在c中调试链表数组
- python - 这个while循环机器学习三次求根算法代码调用函数的逻辑在哪里?
- javascript - 如何使用超出范围的查询响应 mongodb
- nim-lang - 宏通过其定义生成功能实现?
- python - Django:在 MacOS 上升级 sqlite3 数据库,即使升级后 Python 仍然显示旧版本
- javascript - 2 Ponts 仿射变换数据数组
- ios - 如何重复一个函数并每次更改一个变量?
- javascript - 调用AJAX时Rails 6 Production处理html模板而不是js