何人かのコメンターが言及しているように、データ フレーム列の名前変更は遅いです。これは、(方法によっては) data.frame 全体の 1 ~ 4 個のコピーが作成されるためです。data.table
のヘルプページから?setkey
、私が見たこの動作を示す最も良い方法は次のとおりです。
DF = data.frame(a=1:2,b=3:4) # base data.frame to demo copies
try(tracemem(DF)) # try() for non-Windows where R is
# faster without memory profiling
colnames(DF)[1] <- "A" # 4 copies of entire object
names(DF)[1] <- "A" # 3 copies of entire object
names(DF) <- c("A", "b") # 1 copy 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?
物事がこのように行われる理由を理解するには、おそらく R-devel に関する関連する議論のいくつかを掘り下げる必要があります。R- devel : 知覚の高速化とR-devel: NAMES について混乱
それらのスレッドの私の印象的な読みは、次のとおりです。
オリジナルを上書きする前に変更を「試す」ことができるように、少なくとも 1 つのコピーが作成されます。したがって、再割り当てされる値に何か問題がある場合、[<-.data.frame
またはnames<-
「バックアウト」して、元のオブジェクトに損傷を与えることなくエラー メッセージを配信することができます。
R-core の何人かのメンバーは、現在の状況に完全に満足していません。何人かの人々は、場合によっては「R が道に迷う」と説明しています。Luke Tierney は、過去にこのコピーに関連するいくつかの変更を試みたことがあることを示しています。サイモン・アーバネックは、「何かが起こるかもしれない」とほのめかしている。
(しかし、私が言ったように、それはただの印象論です: R の内部構造の詳細についての完全な会話をフォローすることはできません!)
関連して、まだ見ていない場合のために、names(z)[3] <- "c2"
「本当に」のようなものがどのように機能するかを次に示します。
# From ?names<-
z <- "names<-"(z, "[<-"(names(z), 3, "c2"))
注:この回答の多くは、別の質問に対する Matthew Dowle の回答に基づいています。(あなた自身の質問に非常に関連しているので、ここに配置して、もう少し公開する価値があると思いました)。