2014-12-15 28 views
15

Làm thế nào để thực hiện dưới đây (đơn giản sử dụng sqldf) sử dụng data.table và nhận được chính xác cùng một kết quả:Cách thực hiện tham gia qua các phạm vi ngày bằng cách sử dụng data.table?

library(data.table) 

whatWasMeasured <- data.table(start=as.POSIXct(seq(1, 1000, 100), 
    origin="1970-01-01 00:00:00"), 
    end=as.POSIXct(seq(10, 1000, 100), origin="1970-01-01 00:00:00"), 
    x=1:10, 
    y=letters[1:10]) 

measurments <- data.table(time=as.POSIXct(seq(1, 2000, 1), 
    origin="1970-01-01 00:00:00"), 
    temp=runif(2000, 10, 100)) 

## Alternative short names for data.tables 
dt1 <- whatWasMeasured 
dt2 <- measurments 

## Straightforward with sqldf  
library(sqldf) 

sqldf("select * from measurments m, whatWasMeasured wwm 
where m.time between wwm.start and wwm.end") 
+1

Điều này có giải quyết được sự cố của bạn không? http://stackoverflow.com/questions/5123197/matching-time-a-time-in-the-interval-between-a-start-and-end-time –

+0

@DavidRobinson Cảm ơn. Tôi đã thực sự nhìn thấy câu hỏi này và câu trả lời, nhưng tiếc là khối lượng dữ liệu của tôi là rất lớn và thực sự muốn có một giải pháp data.table nhanh ... – Samo

+0

Tôi biết điều này là một chút không thực tế, nhưng tôi là người duy nhất nhận được Dec-31-1969 ngày? Nếu nó không phải là jan-1-1970? –

Trả lời

17

Bạn có thể sử dụng chức năng foverlaps() mà thực hiện tham gia trong khoảng thời gian một cách hiệu quả. Trong trường hợp của bạn, chúng tôi chỉ cần một cột giả cho measurments.

Lưu ý 1: Bạn nên cài đặt các phiên bản phát triển của data.table - v1.9.5 như một lỗi với foverlaps() đã được cố định ở đó. Bạn có thể tìm thấy hướng dẫn cài đặt here.

Note 2: Tôi sẽ gọi whatWasMeasured = dt1measurments = dt2 đây cho thuận tiện.

require(data.table) ## 1.9.5+ 
dt2[, dummy := time] 

setkey(dt1, start, end) 
ans = foverlaps(dt2, dt1, by.x=c("time", "dummy"), nomatch=0L)[, dummy := NULL] 

Xem ?foverlaps để biết thêm và this post để so sánh hiệu suất.

+0

có cách nào chúng ta có thể lấy đi một số loại% giữa% statement? Đã có một thời gian khó khăn để nhận dt2 [thời gian% giữa% dt1 [, danh sách (bắt đầu, kết thúc)]] để làm việc như tôi đã hy vọng. –

+0

@SerbanTanasa, hãy xem [bài đăng] (http://stackoverflow.com/a/25655497/559784) Tôi đã liên kết trong câu trả lời của mình. Nó so sánh hiệu năng của một giải pháp sử dụng 'between'. – Arun

+0

Cảm ơn câu trả lời của bạn. Tuyệt quá. Nó hoạt động. Rất nhanh. Vấn đề nhỏ duy nhất là nó không giống như thiếu giá trị cho bắt đầu hoặc kết thúc hoặc thời gian. có lẽ một xử lý na.rm sẽ là tốt đẹp để có. Ngoài ra, khi thực hiện bài tập này trên dữ liệu thực, tôi nhận được kết quả cuối cùng hai cột không mong muốn bổ sung có tên là "bắt đầu" và "kết thúc" mà tôi không có trong dữ liệu đầu vào cũng không phải là tên của khóa hoặc bất kỳ ... – Samo

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