2012-07-05 8 views
5

Tôi muốn tham gia hai data.table giây bằng cách sử dụng ngày làm tham gia.Tham gia dữ liệu. Có thể vào ngày chính xác hoặc nếu không phải là trường hợp gần nhất ít hơn

Vâng, đôi khi tôi không có kết quả khớp chính xác và trong trường hợp này tôi muốn tìm ngày gần nhất ít hơn. Vấn đề của tôi rất giống với bài đăng này về SQL: SQL Join on Nearest less than date

Tôi biết cú pháp data.table tương tự với SQL nhưng tôi không thể mã hóa điều này. Cú pháp chính xác là gì?

Một ví dụ đơn giản:

Dt1 
    date  x 
1/26/2010 - 10 
1/25/2010 - 9 
1/24/2010 - 9 
1/22/2010 - 7  
1/19/2010 - 11 

Dt2 
    date 
1/26/2010 
1/23/2010 
1/20/2010 

đầu ra

date  x 
1/26/2010 - 10 
1/23/2010 - 7 
1/20/2010 - 11 

Cảm ơn bạn trước.

Trả lời

6

Ở đây bạn đi:

library(data.table) 

Tạo dữ liệu:

Dt1 <- read.table(text=" 
date  x 
1/26/2010, 10 
1/25/2010, 9 
1/24/2010, 9 
1/22/2010, 7  
1/19/2010, 11", header=TRUE, stringsAsFactors=FALSE) 

Dt2 <- read.table(text=" 
date 
1/26/2010 
1/23/2010 
1/20/2010", header=TRUE, stringsAsFactors=FALSE) 

Convert to data.table, chuyển đổi chuỗi đến ngày tháng, và thiết lập các data.table chính:

Dt1 <- data.table(Dt1) 
Dt2 <- data.table(Dt2) 

Dt1[, date:=as.Date(date, format=("%m/%d/%Y"))] 
Dt2[, date:=as.Date(date, format=("%m/%d/%Y"))] 

setkey(Dt1, date) 
setkey(Dt2, date) 

Tham gia vào bảng, sử dụng roll=TRUE:

Dt1[Dt2, roll=TRUE] 

      date x 
[1,] 2010-01-20 11 
[2,] 2010-01-23 7 
[3,] 2010-01-26 10 
+3

@mat Tôi rất vui vì câu trả lời này đã giúp bạn. Để tham khảo trong tương lai: nó giúp ích rất nhiều nếu bạn cung cấp mã có thể tái sản xuất trong câu hỏi của bạn - điều này khuyến khích mọi người trả lời, vì điều đó có nghĩa là chúng tôi không phải tạo lại vấn đề của bạn từ đầu, như tôi đã làm ở đây. Ngoài ra, nếu bạn đã đăng mã của mình bằng thông báo lỗi, chúng tôi có thể giải thích tại sao thông báo lỗi đó xảy ra và cách bạn nên khắc phục. – Andrie

+1

Cảm ơn Andrie và Matthew cho câu trả lời của bạn! Tôi đã thấy thông số này "cuộn" khi tôi đọc tài liệu. Tôi đã thử nó trước nhưng nó không hoạt động, tôi đã có sản lượng này Erreur dans '[.data.table' (pixel, Trep, roll = T): Cố gắng cuộn tham gia vào cột yếu tố i.date. Chỉ số nguyên, số hai hoặc ký tự đại diện có thể được cuộn tham gia. Tôi đã có một vấn đề về định dạng ngày. Bây giờ tôi hiểu vấn đề của tôi đối phó với định dạng ngày. cảm ơn rất nhiều vào nhiều thời gian hơn. – mat

+0

Tôi lưu ý rằng đối với tương lai. cảm ơn – mat

2
?data.table     # search for the `roll` argument 
example(data.table)   # search for the example using roll=TRUE 
vignette("datatable-intro") # see section "3: Fast time series join" 
vignette("datatable-faq") # see FAQs 2.16 and 2.20 

Đây là một trong những tính năng chính của data.table. Vì các hàng được sắp xếp (không giống SQL) nên thao tác này rất đơn giản và rất nhanh. SQL vốn không có thứ tự, do đó bạn cần tự tham gia và 'sắp xếp theo' để thực hiện tác vụ này. Nó có thể được thực hiện trong SQL và nó hoạt động nhưng nó có thể chậm và cần thêm mã. Vì SQL là một kho lưu trữ hàng, ngay cả trong bộ nhớ SQL, nó có một giới hạn thấp hơn được xác định bởi các lần tải trang từ RAM vào bộ đệm L2. data.table thấp hơn giới hạn dưới vì đó là một cửa hàng cột.

2 họa tiết cũng nằm trên homepage.