Tôi đã nghĩ ra một giải pháp để tra cứu các giá trị từ nhiều cột của hai bảng dữ liệu riêng biệt và thêm một cột mới dựa trên tính toán giá trị của chúng (nhiều so sánh có điều kiện). Mã dưới đây. Nó liên quan đến việc sử dụng data.table và join trong khi tính toán các giá trị từ cả hai bảng, tuy nhiên, các bảng không được nối với các cột mà tôi so sánh, và do đó tôi nghi ngờ có thể không nhận được các ưu điểm tốc độ vốn có. Tôi đã đọc rất nhiều về và vui mừng về việc khai thác. Nói cách khác, tôi đang tham gia vào một cột 'giả', vì vậy tôi không nghĩ rằng tôi đang tham gia "đúng".R data.table Multiple Conditions Tham gia
Bài tập được cung cấp cho lưới X theo X dtGrid
và danh sách X^2 sự kiện ngẫu nhiên dtEvents
trong lưới, để xác định số lượng Sự kiện xảy ra trong phạm vi bán kính đơn vị 1 của mỗi điểm lưới. Mã dưới đây. Tôi đã chọn kích thước lưới 100 X 100, mất ~ 1,5 giây để chạy kết nối trên máy của tôi. Nhưng tôi không thể đi lớn hơn nhiều mà không giới thiệu một hit hiệu suất rất lớn (200 X 200 mất ~ 22 giây).
Tôi thực sự thích sự linh hoạt khi có thể thêm nhiều điều kiện vào câu lệnh val
của mình (ví dụ: nếu tôi muốn thêm một loạt các kết hợp AND và OR tôi có thể làm điều đó), vì vậy tôi muốn giữ lại chức năng đó .
Có cách nào để sử dụng dữ liệu. Có thể tham gia ‘đúng’ (hoặc bất kỳ giải pháp data.table nào khác) để đạt được kết quả nhanh hơn/hiệu quả hơn không?
Cảm ơn bạn rất nhiều!
#Initialization stuff
library(data.table)
set.seed(77L)
#Set grid size constant
#Increasing this number to a value much larger than 100 will result in significantly longer run times
cstGridSize = 100L
#Create Grid
vecXYSquare <- seq(0, cstGridSize, 1)
dtGrid <- data.table(expand.grid(vecXYSquare, vecXYSquare))
setnames(dtGrid, 'Var1', 'x')
setnames(dtGrid, 'Var2', 'y')
dtGrid[, DummyJoin:='A']
setkey(dtGrid, DummyJoin)
#Create Events
xrand <- runif(cstGridSize^2, 0, cstGridSize + 1)
yrand <- runif(cstGridSize^2, 0, cstGridSize + 1)
dtEvents <- data.table(x=xrand, y=yrand)
dtEvents[, DummyJoin:='A']
dtEvents[, Counter:=1L]
setkey(dtEvents, DummyJoin)
#Return # of events within 1 unit radius of each grid point
system.time(
dtEventsWithinRadius <- dtEvents[dtGrid, {
val = Counter[(x - i.x)^2 + (y - i.y)^2 < 1^2]; #basic circle fomula: x^2 + y^2 = radius^2
list(col_i.x=i.x, col_i.y=i.y, EventsWithinRadius=sum(val))
}, by=.EACHI]
)
Frank: Guilty as charg. Bạn hoàn toàn đúng. Nó nên nói một X + 1 bởi X + 1 lưới ... Tôi muốn tất cả các điểm sự kiện để phù hợp trong lưới điện, vì vậy tôi đã bao gồm các điểm lưới 0 X và Y. Điều đó nói rằng, vấn đề tôi đang cố gắng giải quyết bị ảnh hưởng tối thiểu bởi sự thay đổi này ... số sự kiện và kích thước lưới là một phần tùy ý, khác hơn là chúng đều lớn. Cảm ơn vì sự đúng đắn của bạn. – ColoradoGranite
Đối với giá trị của nó, nếu bạn có thể chuyển tiêu chí từ vòng tròn đơn vị thành +/- 1 trên mỗi thứ nguyên một cách độc lập, nó có thể nhanh hơn rất nhiều: 'system.time (dtEvents [, { L = lapply (. SD, hàm (x) đại diện (as.integer (tầng (x)), mỗi = 4L)); . ( x = L [[1]] + 0: 1, y = L [[2]] + đại diện (0: 1, mỗi = 2L) ) }, .SDcols = x: y] [, .N, by = x: y]) '. Đó là những gì tôi nghĩ bạn đã làm ban đầu. – Frank