2013-07-26 10 views
30

内の列を追加/削除することができます。他のすべての列を新しい表にコピーすることなく、の中にの文字列を追加/削除できます。data.frameをインプレースで(破壊的に)変更することは可能ですか?

これはバニラで可能ですかdata.frame

PS。私は列を「機能的に」追加/削除する方法、すなわち元のものを変更することなく新しいフレームを作成する方法を知っています。

答えて

33

data.frameから既存の列を削除または変更するには、data.table::setを参照してください。あなたはコピーを作成せずに列を追加することはできません。コピーを作成せずにdata.tableに列を追加できる理由は、data.table以上がメモリを割り当てているためです。詳細については、?alloc.colを参照してください。

R> library(data.table) 
R> data(mtcars) 
R> tracemem(mtcars) 
[1] "<0x59fef68>" 
R> set(mtcars, j="mpg", value=NULL)  # remove a column 
R> set(mtcars, j="cyl", value=rep(42, 32)) # modify a column 
R> untracemem(mtcars) 
R> str(mtcars) 
'data.frame': 32 obs. of 10 variables: 
$ cyl : num 42 42 42 42 42 42 42 42 42 42 ... 
$ disp: num 160 160 108 258 360 ... 
$ hp : num 110 110 93 110 175 105 245 62 95 123 ... 
$ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ... 
$ wt : num 2.62 2.88 2.32 3.21 3.44 ... 
$ qsec: num 16.5 17 18.6 19.4 17 ... 
$ vs : num 0 0 1 1 0 1 0 1 1 1 ... 
$ am : num 1 1 1 0 0 0 0 0 0 0 ... 
$ gear: num 4 4 4 3 3 3 3 4 4 4 ... 
$ carb: num 4 4 1 1 2 1 4 2 2 4 ... 

は、通常のdata.frame操作で

R> data(mtcars) 
R> tracemem(mtcars) 
[1] "<0x6b3ec30>" 
R> mtcars[, "mpg"] <- NULL 
tracemem[0x6b3ec30 -> 0x84de0c8]: 
tracemem[0x84de0c8 -> 0x84de410]: [<-.data.frame [<- 
tracemem[0x84de410 -> 0x84de6b0]: [<-.data.frame [<- 
R> tracemem(mtcars) 
[1] "<0x84dca30>" 
R> mtcars[, "cyl"] <- rep(42, 32) 
tracemem[0x84dca30 -> 0x84dcc28]: 
tracemem[0x84dcc28 -> 0x84dd018]: [<-.data.frame [<- 
tracemem[0x84dd018 -> 0x84dff70]: [<-.data.frame [<- 
R> untracemem(mtcars) 
R> data(mtcars) 
+4

+1私はあなたがこれを行うことが実現しなかったことを比較してください。かなりクールだと思います –

+4

もしあなたが/結果のメモリプロファイリングでそれをやったなら、私は非常に感銘を受けたでしょう! :-) –

+0

@GavinSimpsonそれはあなたが念頭に置いていたものですか? – GSee

関連する問題