2011-10-27 32 views
14

Tôi có câu hỏi về thành phần data.table cho "không tham gia", lấy cảm hứng từ số question của Iterator. Dưới đây là một ví dụ:không tham gia với data.tables

library(data.table) 

dt1 <- data.table(A1=letters[1:10], B1=sample(1:5,10, replace=TRUE)) 
dt2 <- data.table(A2=letters[c(1:5, 11:15)], B2=sample(1:5,10, replace=TRUE)) 

setkey(dt1, A1) 
setkey(dt2, A2) 

Các data.table s giống như thế này

> dt1    > dt2 
     A1 B1    A2 B2 
[1,] a 1   [1,] a 2 
[2,] b 4   [2,] b 5 
[3,] c 2   [3,] c 2 
[4,] d 5   [4,] d 1 
[5,] e 1   [5,] e 1 
[6,] f 2   [6,] k 5 
[7,] g 3   [7,] l 2 
[8,] h 3   [8,] m 4 
[9,] i 2   [9,] n 1 
[10,] j 4   [10,] o 1 

Để tìm mà hàng trong dt2 có khóa tương tự trong dt1, thiết lập which tùy chọn để TRUE:

> dt1[dt2, which=TRUE] 
[1] 1 2 3 4 5 NA NA NA NA NA 

Matthew đề xuất trong số answer, rằng thành ngữ "không tham gia"

dt1[-dt1[dt2, which=TRUE]] 

để đặt số dt1 thành các hàng có chỉ mục không xuất hiện trong dt2. Trên máy tính của tôi với data.table v1.7.1 tôi nhận được một lỗi:

Error in `[.default`(x[[s]], irows): only 0's may be mixed with negative subscripts 

Thay vào đó, với các tùy chọn nomatch=0, "không tham gia" hoạt động

> dt1[-dt1[dt2, which=TRUE, nomatch=0]] 
    A1 B1 
[1,] f 2 
[2,] g 3 
[3,] h 3 
[4,] i 2 
[5,] j 4 

Đây có phải là ý định hành vi?

+2

Chỉ cần thêm vào v1.8.3 là cú pháp _not-join_. Trong trường hợp này là 'dt1 [! Dt2]'. Sẽ thêm câu trả lời chi tiết ... –

Trả lời

5

Theo như tôi biết, đây là một phần của R. cơ sở

# This works 
(1:4)[c(-2,-3)] 

# But this gives you the same error you described above 
(1:4)[c(-2, -3, NA)] 
# Error in (1:4)[c(-2, -3, NA)] : 
# only 0's may be mixed with negative subscripts 

Thông báo lỗi văn bản chỉ ra rằng nó hành vi dự định.

Dưới đây là dự đoán hết sức mình để tại sao đó là hành vi dự kiến:

Từ cách họ đối xử với NA 's ở nơi khác (ví dụ điển hình mặc định cho na.rm=FALSE), có vẻ như các nhà thiết kế R của xem NA' s như mang theo thông tin quan trọng, và rất khinh thường để thả mà không có một số hướng dẫn rõ ràng để làm như vậy. (May mắn thay, thiết nomatch=0 cung cấp cho bạn một cách sạch sẽ để vượt qua giảng dạy cùng!)

Trong bối cảnh này, các nhà thiết kế sở thích có thể giải thích tại sao NA 's được chấp nhận cho chỉ mục tích cực, nhưng không cho đánh chỉ số tiêu cực:

# Positive indexing: works, because the return value retains info about NA's 
(1:4)[c(2,3,NA)] 

# Negative indexing: doesn't work, because it can't easily retain such info 
(1:4)[c(-2,-3,NA)] 
+1

+1 Câu trả lời hay! Có nó là từ cơ sở. [FR # 1384] (https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1384&group_id=240&atid=978) là làm cho cú pháp 'X [-Y]' có nghĩa là 'không tham gia'. Trong khi đó, '= = TRUE, nomatch = 0' là cần thiết. –

2

mới trong phiên bản 1.7.3 của data.table:

New option datatable.nomatch allows the default for nomatch to be changed from NA to 0, ...

+3

Thay đổi đó có thể giúp ích một chút nhưng không nhằm mục đích 'không tham gia' thực sự. [FR # 1384] (https://r-forge.r-project.org/tracker/index.php?func=detail&aid=1384&group_id=240&atid=978) vẫn còn hoạt động.Tốt để xem ai đó đọc NEWS mặc dù :) –

17

mới trong v1.8.3:

A new "!" prefix on i signals 'not-join' (a.k.a. 'not-where'), #1384. 
    DT[-DT["a", which=TRUE, nomatch=0]] # old not-join idiom, still works 
    DT[!"a"]        # same result, now preferred. 
    DT[!J(6),...]       # !J == not-join 
    DT[!2:3,...]       # ! on all types of i 
    DT[colA!=6L | colB!=23L,...]   # multiple vector scanning approach 
    DT[!J(6L,23L)]      # same result, faster binary search 
'!' has been used rather than '-' : 
    * to match the 'not-join' and 'not-where' nomenclature 
    * with '-', DT[-0] would return DT rather than DT[0] and not be backwards 
    compatibile. With '!', DT[!0] returns DT both before (since !0 is TRUE in 
    base R) and after this new feature. 
    * to leave DT[+...] and DT[-...] available for future use 
Các vấn đề liên quan