首页 > 解决方案 > 如何不从原始 data.table 中删除列?

问题描述

我注意到包的一个特性data.table,它可能与包的巧妙内存分配有关。我想从现有的数据表中创建一个新的 data.table 并从新的数据表中删除列。但是,该:= NULL例程会在我没有特别要求的情况下从两个 data.tables 中删除列。

library(data.table)

dt1 <- data.table(A = rnorm(10,5,6), B = rnorm(10,2,1), C = rnorm(10,10,2))

dt2 <- dt1

names(dt1)
names(dt2)

dt2[, c("B", "C") := NULL]

names(dt2) # Expected
# [1] "A"
names(dt1) # Weird!
# [1] "A"

我目前避免这种情况的解决方案是将 data.table 转换为 data.frame,删除列,然后将其转换回 data.table:

dt1 <- data.table(A = rnorm(10,5,6), B = rnorm(10,2,1), C = rnorm(10,10,2))

dt2 <- as.data.frame(dt1)
dt2 <- as.data.table(dt2[!names(dt2) %in% c("B", "C")])

names(dt1) # Expected
# [1] "A" "B" "C"
names(dt2) # Expected
# [1] "A"

必须有一种更直观、内存和代码效率更高的方式来执行此操作。有什么建议么?

标签: rdata.table

解决方案


你应该使用

dt2 <- copy(dt1) 

推荐阅读