2012-07-06 30 views
24

Có cách nào để ngăn không cho data.table in dữ liệu mới. Có thể sau khi gán một cột mới theo tham chiếu? Tôi thu thập hành vi tiêu chuẩn làlàm thế nào để ngăn chặn đầu ra khi sử dụng `: =` trong R {data.table}, trước v1.8.3?

library(data.table) 
example(data.table) 
DT 
# x y v 
# 1: a 1 42 
# 2: a 3 42 
# 3: a 6 42 
# 4: b 1 11 
# 5: b 3 11 
# 6: b 6 11 
# 7: c 1 7 
# 8: c 3 8 
# 9: c 6 9 

DT[,z:=1:nrow(DT)] 

# x y v z 
# 1: a 1 42 1 
# 2: a 3 42 2 
# 3: a 6 42 3 
# 4: b 1 11 4 
# 5: b 3 11 5 
# 6: b 6 11 6 
# 7: c 1 7 7 
# 8: c 3 8 8 
# 9: c 6 9 9 

tức là bảng được in ra màn hình sau khi gán. Có cách nào để dừng data.table hiển thị bảng mới sau khi gán cột mới z? Tôi biết tôi có thể ngăn chặn hành vi này bằng cách nói

DT <- copy(DT[,z:=1:nrow(DT)]) 

nhưng đang đánh bại mục đích := (được thiết kế để tránh sao chép).

Trả lời

25

Kể từ <-.data.table không tạo một bản sao, bạn có thể sử dụng <-:

Tạo một đối tượng data.table:

library(data.table) 
di <- data.table(iris) 

Tạo một cột mới:

di <- di[, z:=1:nrow(di)] 
di 

#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species z 
# [1,]   5.1   3.5   1.4   0.2 setosa 1 
# [2,]   4.9   3.0   1.4   0.2 setosa 2 
# [3,]   4.7   3.2   1.3   0.2 setosa 3 
# [4,]   4.6   3.1   1.5   0.2 setosa 4 
# [5,]   5.0   3.6   1.4   0.2 setosa 5 
# [6,]   5.4   3.9   1.7   0.4 setosa 6 
# [7,]   4.6   3.4   1.4   0.3 setosa 7 
# [8,]   5.0   3.4   1.5   0.2 setosa 8 
# [9,]   4.4   2.9   1.4   0.2 setosa 9 
# [10,]   4.9   3.1   1.5   0.1 setosa 10 
# First 10 rows of 150 printed. 

Nó cũng đáng ghi nhớ rằng R chỉ in giá trị của một đối tượng trong tương tác chế độ e.

Vì vậy, trong chế độ hàng loạt, bạn có thể chỉ cần sử dụng:

di[, z:=1:nrow(di)] 

này sẽ không tạo ra bất kỳ đầu ra khi chạy như một kịch bản trong chế độ hàng loạt.

thông tin

Hơn nữa từ Matthew Dowle:

Cũng xem FAQ 2.21 và 2.22:

2,21 Tại sao DT[i,col:=value] trả lại toàn bộ DT? Tôi mong đợi hoặc không có giá trị hiển thị (phù hợp với <-) hoặc giá trị trả về hoặc thông báo chứa số lượng hàng được cập nhật. Nó không phải là rõ ràng rằng các dữ liệu đã thực sự được cập nhật bằng cách tham khảo.

Vì vậy, cú pháp ghép đó có thể hoạt động; ví dụ: DT[i,done:=TRUE][,sum(done)]. Số hàng được cập nhật được trả lại khi độ dài được bật, trên cơ sở mỗi truy vấn hoặc trên toàn cầu sử dụng options(datatable.verbose=TRUE).

2.22 Ok, nhưng không thể trả về giá trị trả lại là DT[i,col:=value] không xác định, sau đó?

  • Chúng tôi đã thử nhưng R nội lực buộc hiển thị trên cho [. Giá trị của Cột eval của FunTab (xem src/main/names.c) cho [0 có nghĩa là bắt buộc R_Visible bật (xem phần R-Internals 1.6). Do đó, khi chúng tôi đã thử invisible() hoặc đặt R_Visible thành 0 trực tiếp, eval trong src/main/eval.c sẽ bắt đầu lại.
  • Sau khi quen với hành vi này, bạn có thể phát triển để thích nó hơn (chúng tôi có). Xét cho cùng, chúng ta sẽ phân bổ bao nhiêu lần bằng cách sử dụng <- và sau đó ngay lập tức xem xét dữ liệu để kiểm tra xem có ổn không?
  • Chúng tôi có thể kết hợp := vào j cũng trả về dữ liệu; bản cập nhật hỗn hợp và chọn trong một truy vấn. Để phát hiện xem j chỉ cập nhật (và sau đó hành xử một cách nhẹ nhàng) có thể gây nhầm lẫn.

Second cập nhật từ Matthew Dowle:

Bây giờ chúng ta đã tìm thấy một giải pháp và v1.8.3 không còn in kết quả khi := được sử dụng. Chúng tôi sẽ cập nhật Câu hỏi thường gặp 2.21 và 2.22.

+0

Cảm ơn! Tôi sẽ sử dụng '<-' trong trường hợp đó. –

+2

+10 Tôi không nghĩ thử 'DT <-DT [i, col: = value]'. Sự lặp lại của tên biến không phải là tuyệt vời, nhưng hoạt động. Điều đó mang lại cho tôi một ý tưởng làm thế nào để có được 'DT [i, col: = value]' để trả về vô hình: bây giờ được nâng lên như [FR # 2128] (https://r-forge.r-project.org/tracker/index. php? func = chi tiết & trợ giúp = 2128 & group_id = 240 & atid = 978), cảm ơn! –

+0

+1 cho thông minh hùng mạnh hack + đoạn trích thú vị từ Câu hỏi thường gặp. –

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