2015-03-05 38 views

Trả lời

9

Hiện tại, cách để thực hiện việc này là trích xuất các chỉ mục đầu tiên và sau đó thực hiện một phép gán theo tham chiếu.

idx = DT[, .(idx = .I[c(1L, .N)]), by=class]$idx 
DT[idx, v := NA] 

Tôi sẽ thử thêm ví dụ này vào họa tiết Reference semantics.

+0

Lệnh thứ hai có thể được thực hiện với một cái gì đó như 'bộ (DT, j =" v ", i = idx, giá trị = NA)', phải không? Bạn sẽ biết rõ hơn tôi có nhanh hơn không. – Frank

+1

@Frank, nếu bạn đang thực hiện nó lặp đi lặp lại, có 'set()' sẽ nhanh hơn vì nó không có phí của '[.data.table'. Không nên quan trọng ở đây. – Arun

1

Với một hàm helper thật dễ dàng

set.na = function(x,y) {x[y] = NA; x} 
DT[, set.na(v,c(1,.N)) , by=class] 
0

Cách kinh điển để sửa đổi các tập con của dữ liệu là sử dụng i để xác định tập hợp con. Bạn không thể sử dụng [ cùng với :=. Hoặc tạo một i tạm thời theo đề xuất của @David Arenburg hoặc bạn có thể tự tạo ra kết quả bằng cách sử dụng một công trình xây dựng c(NA, v[-c(1, .N)], NA).

DT[, v := c(NA, v[-c(1, .N)], NA)[1:.N], by = class] 

Tuy nhiên, bạn cũng nên lưu ý rằng thứ tự hàng có thể thay đổi khi bạn ví dụ: đặt một khóa mới hoặc sử dụng bất kỳ số lượng chức năng nào. Vì vậy, bạn nên rất cẩn thận với hoạt động này.

3

Điều này có thể không phải là một one-liner, nhưng nó có 'đầu tiên' và 'cuối cùng' trong mã :)

> DT <- data.table(v = rnorm(12), class=rep(1:3, each=4)) 
> setkey(DT, class) 
> classes = DT[, .(unique(class))] 
> DT[classes, v := NA, mult='first'] 
> DT[classes, v := NA, mult='last'] 
> DT 
      v class 
1:  NA  1 
2: -1.8191  1 
3: -0.6355  1 
4:  NA  1 
5:  NA  2 
6: -1.1771  2 
7: -0.8125  2 
8:  NA  2 
9:  NA  3 
10: 0.2357  3 
11: 0.3416  3 
12:  NA  3 
> 

thứ tự cũng được bảo tồn cho các cột không quan trọng. Tôi nghĩ đó là một tính năng được ghi nhận (cam kết).

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