23

私はdata.frame1900万行90列のRを持っています。予備の RAM と CPU サイクルがたくさんあります。このデータ フレーム内の単一の列名を変更することは、R にとって非常に集中的な操作のようです。

system.time(colnames(my.df)[1] <- "foo")
   user  system elapsed 
 356.88   16.54  373.39 

これはなぜですか?すべての行に何らかの形で列名が格納されていますか? これはまったく新しいデータ フレームを作成していますか? この操作はごくわずかな時間で完了するはずです。R のマニュアル エントリには、明らかなことは何もありません。

Windows 7 で R (64 ビット) のビルド 7600 を実行しています。現在のワークスペースでは、小さな data.frame に colnames を設定すると、system.time().

編集: を使用できる可能性があることは承知してdata.tableおり、正直なところ、お茶を飲みに行く間、名前の変更が完了するまで 5 分間待つことができます。私が興味を持っているのは、何が起こっているのか、そしてその理由は何ですか?

4

1 に答える 1

21

何人かのコメンターが言及しているように、データ フレーム列の名前変更は遅いです。これは、(方法によっては) 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. オリジナルを上書きする前に変更を「試す」ことができるように、少なくとも 1 つのコピーが作成されます。したがって、再割り当てされる値に何か問題がある場合、[<-.data.frameまたはnames<-「バックアウト」して、元のオブジェクトに損傷を与えることなくエラー メッセージを配信することができます。

  2. R-core の何人かのメンバーは、現在の状況に完全に満足していません。何人かの人々は、場合によっては「R が道に迷う」と説明しています。Luke Tierney は、過去にこのコピーに関連するいくつかの変更を試みたことがあることを示しています。サイモン・アーバネックは、「何かが起こるかもしれない」とほのめかしている。

(しかし、私が言ったように、それはただの印象論です: R の内部構造の詳細についての完全な会話をフォローすることはできません!)


関連して、まだ見ていない場合のために、names(z)[3] <- "c2"「本当に」のようなものがどのように機能するかを次に示します。

# From ?names<-
z <- "names<-"(z, "[<-"(names(z), 3, "c2"))

注:この回答の多くは、別の質問に対する Matthew Dowle の回答に基づいています。(あなた自身の質問に非常に関連しているので、ここに配置して、もう少し公開する価値があると思いました)。

于 2012-06-14T18:48:56.870 に答える