有一个函数 setnames 内置在包 data.table 中。
setnames(DT, "b", "d")
它通过引用更改名称,根本没有副本。使用names(data)<- 或names(data)[i]<- 或类似方法的任何其他方法都会复制整个 对象,通常是多次。即使您所做的只是更改列名。
DT 必须输入 data.table 才能使 setnames 工作。所以你需要切换到data.table 或使用as.data.table 转换,才能使用它。
这是来自?setnames 的摘录。目的是您在提示符下运行 example(setnames),然后 cmets 与您看到的 tracemem 报告的副本相关。
DF = data.frame(a=1:2,b=3:4) # base data.frame to demo copies
tracemem(DF)
colnames(DF)[1] <- "A" # 4 copies of entire object
names(DF)[1] <- "A" # 3 copies of entire object
names(DF) <- c("A", "b") # 2 copies of entire object
`names<-`(DF,c("A","b")) # 1 copy of entire object
x=`names<-`(DF,c("A","b")) # still 1 copy (so not print method)
# What if DF is large, say 10GB in RAM. Copy 10GB just to change a column name?
DT = data.table(a=1:2,b=3:4,c=5:6)
tracemem(DT)
setnames(DT,"b","B") # by name; no match() needed. No copy.
setnames(DT,3,"C") # by position. No copy.
setnames(DT,2:3,c("D","E")) # multiple. No copy.
setnames(DT,c("a","E"),c("A","F")) # multiple by name. No copy.
setnames(DT,c("X","Y","Z")) # replace all. No copy.