2011-10-19 25 views
6

[Cập nhật 1: Như Matthew Dowle đã lưu ý, tôi đang sử dụng data.table phiên bản 1.6.7 trên R-Forge, chứ không phải CRAN. Bạn sẽ không thấy cùng một hành vi với phiên bản cũ hơn của data.table.]Chuyển các hoạt động thiết lập từ khung dữ liệu của R sang bảng dữ liệu: Cách xác định các hàng trùng lặp?

Là một số chức năng tiện ích nhỏ để thực hiện các hoạt động trên các hàng của khung dữ liệu hoặc cặp khung dữ liệu (tức là mỗi hàng là một phần tử trong một tập hợp), vd duy nhất - để tạo một tập hợp từ danh sách, công đoàn, giao lộ, chênh lệch cài đặt, v.v ... bắt chước các số, setdiff(...,'rows'), v.v., dường như không có đối tác trong R (hoạt động thiết lập của R được giới hạn trong vectơ và danh sách, nhưng không phải các hàng ma trận hoặc khung dữ liệu). Ví dụ về các chức năng nhỏ này dưới đây. Nếu chức năng này cho các khung dữ liệu đã tồn tại trong một số gói hoặc cơ sở R, tôi sẽ mở ra các đề xuất.

Tôi đã được di cư này để bảng dữ liệu và một bước cần thiết trong cách tiếp cận hiện nay là để tìm hàng trùng lặp. Khi duplicated() được thi hành, một lỗi được trả về cho biết các bảng dữ liệu phải có khóa. Đây là một rào cản không may - ngoài việc thiết lập các khóa, mà không phải là một giải pháp phổ quát và thêm vào chi phí tính toán, có cách nào khác để tìm các đối tượng trùng lặp không?

Dưới đây là một ví dụ tái sản xuất:

library(data.table) 
set.seed(0) 
x <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4)) 
y <- as.data.table(matrix(sample(2, 100, replace = TRUE), ncol = 4)) 

res3 <- dt_intersect(x,y) 

yielding thông báo lỗi này:

Error in duplicated.data.table(z_rbind) : data table must have keys 

Mã này hoạt động như nó vốn có cho khung dữ liệu, mặc dù tôi đã đặt tên mỗi chức năng với mô hình dt_operation .

Có cách nào để giải quyết vấn đề này không? Các phím cài đặt chỉ hoạt động với các số nguyên, đây là một ràng buộc mà tôi không thể giả định cho dữ liệu đầu vào. Vì vậy, có lẽ tôi đang thiếu một cách thông minh để sử dụng bảng dữ liệu?


Ví dụ thiết lập các chức năng hoạt động, nơi các phần tử của tập hợp là dòng dữ liệu:

dt_unique  <- function(x){ 
    return(unique(x)) 
} 

dt_union  <- function(x,y){ 
    z_rbind  <- rbind(x,y) 
    z_unique <- dt_unique(z_rbind) 
    return(z_unique) 
} 

dt_intersect <- function(x,y){ 
    zx   <- dt_unique(x) 
    zy   <- dt_unique(y) 

    z_rbind  <- rbind(zy,zx) 
    ixDupe  <- which(duplicated(z_rbind)) 
    z   <- z_rbind[ixDupe,] 
    return(z) 
} 

dt_setdiff  <- function(x,y){ 
    zx   <- dt_unique(x) 
    zy   <- dt_unique(y) 

    z_rbind  <- rbind(zy,zx) 
    ixRangeX <- (nrow(zy) + 1):nrow(z_rbind) 
    ixNotDupe <- which(!duplicated(z_rbind)) 
    ixDiff  <- intersect(ixNotDupe, ixRangeX) 
    diffX  <- z_rbind[ixDiff,] 
    return(diffX) 
} 

Lưu ý 1: Một dự định sử dụng cho các chức năng này helper là tìm hàng nơi các giá trị quan trọng trong x không nằm trong số các giá trị khóa trong y. Bằng cách này, tôi có thể tìm thấy nơi NA có thể xuất hiện khi tính x[y] hoặc y[x]. Mặc dù việc sử dụng này cho phép thiết lập các khóa cho đối tượng z_rbind, tôi không muốn hạn chế bản thân mình chỉ trong trường hợp sử dụng này.

Lưu ý 2: Đối với các bài đăng có liên quan, here is a post khi chạy unique trên khung dữ liệu, với kết quả xuất sắc để chạy nó với gói data.table được cập nhật. Và this is an earlier post khi chạy unique trên bảng dữ liệu.

Trả lời

6

duplicated.data.table cần sửa lỗi tương tự unique.data.table nhận [CHỈNH SỬA: Bây giờ đã thực hiện trong v1.7.2]. Vui lòng tăng một báo cáo lỗi khác: bug.report(package="data.table"). Vì lợi ích của người khác đang xem, bạn đã sử dụng v1.6.7 từ R-Forge, chứ không phải 1.6.6 trên CRAN.

Nhưng, trên Note 1, có một 'không tham gia' thành ngữ:

x[-x[y,which=TRUE]] 

Xem thêm FR#1384 (New 'không' và tranh cãi 'whichna'?) Để làm điều đó dễ dàng hơn cho người dùng, và rằng các liên kết đến chuỗi keys that don't match được đưa vào chi tiết hơn.


Cập nhật. Bây giờ trong v1.8.3, không tham gia đã được thực hiện.

DT[-DT["a",which=TRUE,nomatch=0],...] # old idiom 
DT[!"a",...]       # same result, now preferred. 
+0

Cảm ơn! Điểm tốt - Tôi quên đề cập đến rằng tôi đã cập nhật 'data.table'. Ngoài ra, 'bug.report()' là mới đối với tôi. – Iterator

+0

Matthew, mã của bạn có phải là 'x [-x [y, mà = TRUE, nomatch = 0]]'? Không có đối số 'nomatch = 0' tôi nhận được lỗi này:' Lỗi trong [.default (x [[s]], irows): chỉ 0 có thể được trộn lẫn với các subscript không âm'. – Ryogi

+0

@RYogi. Không chắc. Cần một ví dụ xin vui lòng, có lẽ trong một câu hỏi mới. –

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