まさにそのための機能setnames
がパッケージに組み込まれています。data.table
setnames(DT, "b", "d")
コピーなしで参照によって名前を変更します。names(data)<-
またはnames(data)[i]<-
類似のものを使用する他の方法では、オブジェクト全体が通常数回コピーされます。あなたがしているのは列名を変更することだけですが。
DT
ただし、機能するには型data.table
でなければなりませんsetnames
。したがって、使用するには、に切り替えるdata.table
か、変換する必要がありas.data.table
ます。
からの抜粋です?setnames
。意図は、プロンプトで実行するexample(setnames)
と、コメントが によって報告されているコピーに関連することです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.