2013-07-26 31 views

Trả lời

33

Bạn có thể xóa hoặc sửa đổi cột hiện tại từ data.frame bằng cách tham chiếu với data.table::set. Tôi nghi ngờ bạn có thể thêm một cột mà không cần sao chép. Lý do bạn có thể thêm cột vào data.table mà không tạo bản sao là data.table qua cấp phát bộ nhớ. Xem ?alloc.col để biết thêm.

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 ... 

Hãy so sánh điều đó với các hoạt động bình thường 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 Tôi đã không nhận ra bạn có thể làm điều này. Khá thú vị Tôi đoán –

+4

Nếu bạn đã làm điều đó với bộ nhớ hồ sơ trên/kết quả tôi rất ấn tượng! :-) –

+0

@GavinSimpson Đó là những gì bạn có trong tâm trí? – GSee

Các vấn đề liên quan