2014-05-20 21 views
6

tôi vẫn đang bối rối bởi hành vi của data.table J.R data.table J hành vi

> DT = data.table(A=7:3,B=letters[5:1]) 
> DT 
    A B 
1: 7 e 
2: 6 d 
3: 5 c 
4: 4 b 
5: 3 a 
> setkey(DT, A, B) 

> DT[J(7,"e")] 
    A B 
1: 7 e 

> DT[J(7,"f")] 
    A B 
1: 7 f # <- there is no such line in DT 

nhưng không có dòng như vậy trong DT. Tại sao chúng ta có được kết quả này?

Trả lời

5

Các data.table J(7, 'f') là nghĩa đen một đơn hàng data.table mà bạn đang tham gia của riêng bạn data.table với. Khi bạn gọi x[i], bạn đang xem từng hàng trong số i và tìm tất cả các kết quả phù hợp cho điều này trong x. Giá trị mặc định là để cho NA cho các hàng trong i không phù hợp với bất cứ điều gì, đó là dễ dàng hơn nhìn thấy bằng cách thêm cột khác để DT:

DT <- data.table(A=7:3,B=letters[5:1],C=letters[1:5]) 
setkey(DT, A, B) 
DT[J(7,"f")] 
# A B C 
# 1: 7 f NA 

gì bạn đang nhìn thấy là hàng duy nhất tại J với không phù hợp với bất cứ điều gì trong DT. Để ngăn chặn data.table từ báo cáo phi trận đấu, bạn có thể sử dụng nomatch=0

DT[J(7,"f"), nomatch=0] 
# Empty data.table (0 rows) of 3 cols: A,B,C 
2

Có lẽ việc thêm một cột bổ sung sẽ làm sáng tỏ một số điều đang diễn ra.

DT[, C:=paste0(A, B)] 

DT[J(7,"e")] 
### A B C 
### 1: 7 e 7e 

DT[J(7,"f")] 
### A B C 
### 1: 7 f NA 

Đây là hành vi tương tự như không J:

setkey(DT, B) 

DT["a"] 
### B A C 
### 1: a 3 3a 

DT["A"] 
### B A C 
### 1: A NA NA 

Bạn có thể sử dụng đối số nomatch để thay đổi hành vi này.

DT[J(7,"f"), nomatch=0L] 
### Empty data.table (0 rows) of 3 cols: A,B,C 
+3

Có lẽ bạn có thể thêm một lời giải thích của 'luận nomatch' và làm thế nào nó có thể được sử dụng? – BenBarnes

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