2012-05-21 31 views
5

Tôi đang cố gắng tìm hiểu gói data.table trong R. Tôi có bảng dữ liệu có tên là DT1 và khung dữ liệu DF1 và tôi muốn đặt một số trường hợp theo một điều kiện lôgic (tách rời). Đây là mã của tôi bây giờ:Bạn sẽ dịch điều này sang ngôn ngữ gói data.table trong R như thế nào?

DF1[DF1$c1==0 | DF1$c2==1,] #the data.frame way with the data.frame DF1 
DT1[DT1$c1==0 | DT1$c2==1,] #the data.frame way with the data.table DT1 

Trên trang 5 của "Introduction to the data.table package in R", tác giả đưa ra một ví dụ về một cái gì đó tương tự nhưng với một conjuction (thay thế | bởi & trong dòng thứ hai ở trên) và nhận xét đó là một sử dụng xấu của data.table gói. Ông gợi ý todo nó theo cách này thay vì:

setkey(DT1,c1,c2) 
DT1[J(0,1)] 

Vì vậy, câu hỏi của tôi là: Làm thế nào tôi có thể viết điều kiện phân ly với cú pháp data.table gói? Có phải đó là lạm dụng dòng thứ hai của tôi DT1[DT1$c1==0 | DT1$c2==1,]? Có tương đương với J nhưng để tách rời?

Trả lời

4

Tài liệu đó chỉ ra rằng bạn có thể sử dụng:

DT1[c1==0 | c2==1, ] 
+0

Tôi nghĩ câu trả lời của bạn vẫn là quét vectơ. Cảm ơn anyway @DWin! – Nestorghh

+0

Có 3 lần quét vectơ (hai '==' và một '|') cộng với phân bổ vectơ liên quan như được mô tả trong họa tiết giới thiệu. Tài liệu đó cho thấy một cái gì đó tương tự như chứng minh _bad_ sử dụng không sử dụng tốt. @ Nestorghh Nhưng bạn có thực sự có nghĩa là disjoint trên hai cột ('c1' và' c2')? Tách rời trong một cột là câu trả lời của Christoph: 'J (c (0,1))'. Bỏ qua hai cột là quét vectơ cho đến khi các phím thứ cấp được tích hợp hoặc tìm kiếm "khóa phụ thủ công" cho một phương thức thích hợp hơn trong thời gian chờ đợi. –

+0

Tôi đã thấy rằng nó được gọi là "xấu" thực hành, nhưng tôi không thấy một ví dụ về "sử dụng đúng" sẽ áp dụng trong trường hợp hai cột này, cũng như tôi không tìm thấy một trong FAQ, cũng không tìm kiếm tài liệu lưu trữ, trong nhiều lần thử nghiệm. –

3

Dưới đây là một giải pháp:

grpsize = ceiling(1e7/26^2) 
DT <- data.table(
    x=rep(LETTERS,each=26*grpsize), 
    y=rep(letters,each=grpsize), 
    v=runif(grpsize*26^2)) 

setkey(DT, x) 
system.time(DT1 <- DT[x=="A" | x=="Z"]) 
    user system elapsed 
    0.68 0.05 0.74 
system.time(DT2 <- DT[J(c("A", "Z"))]) 
    user system elapsed 
    0.08 0.00 0.07 
all.equal(DT1[, v], DT2[, v]) 
TRUE 

Lưu ý rằng tôi đã lấy ví dụ từ tài liệu data.table. Sự khác biệt duy nhất là tôi không chuyển đổi các chữ cái thành các yếu tố nữa bởi vì các phím ký tự hiện được cho phép (xem NEWS cho v 1.8.0).

Giải thích ngắn: J chỉ ngắn cho data.table. Vì vậy, nếu bạn gọi J(0, 1) bạn tạo một data.table với hai cột phù hợp, giống như trong ví dụ:

> J(0,1) 
    V1 V2 
[1,] 0 1 

Bạn, tuy nhiên, muốn kết hợp hai yếu tố khác nhau trong một cột. Do đó, bạn cần một data.table với một cột. Vì vậy, chỉ cần thêm c().

J(c(0,1)) 
    V1 
[1,] 0 
[2,] 1 
+1

+1. Nhưng OP cần phải làm rõ: anh ta thực sự có nghĩa là rời rạc trên hai cột ('c1' và' c2')? Câu trả lời này là tốt cho phân tách trong một cột. –

+0

@MatthewDowle Phải, tôi đã bỏ lỡ ... Tôi đoán OP có nghĩa là thực sự rời rạc trên hai cột. –

+0

@MatthewDowle & @Christoph_J, tôi có nghĩa là phân tách trên hai cột '' c1'' và '' c2'' của '' data.table'' '' DT1''. Tôi có phải làm theo cách quét véc tơ không?Cảm ơn – Nestorghh

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