İki ayrı veri tablosunun birden çok sütunundan arama değerlerine bir çözüm geliştirdim ve değerlerinin yeni bir sütun tabanlı hesaplamaları ekleyin (çoklu koşullu karşılaştırmalar). Aşağıdaki kod. Her iki tablodan değerleri hesaplarken bir data.table kullanmayı ve birleştirme işlemini içerir, ancak tablolar karşılaştırdığım sütunlarda birleştirilmez ve bu nedenle data.tables'in doğasındaki hız avantajlarını elde edemeyeceğimi sanıyorum. Hakkında çok şey okudum ve dokunarak heyecanlıyım. Başka bir şekilde, 'kukla' sütununa katılıyorum, bu yüzden "düzgün bir şekilde" katıldığımı sanmıyorum.R data.table Çoklu Koşullar Katıl
Alıştırma X X ızgarası dtGrid
ve X^listesiyle verilir Her grid noktasının 1 birim yarıçapında kaç tane Olay olduğunu belirlemek için, ızgara içinde 2 rastgele Olaylar dtEvents
. Kod aşağıda. Makinemde birleştirme işlemini gerçekleştirmek için ~ 1.5 saniye süren 100 X 100 boyutunda bir ızgara seçtim. Fakat çok büyük bir performans isabeti yapmadan çok daha fazla gidemem (200 X 200 ~ 22 saniye sürer).
Gerçekten (ı AND bir demet eklemek istedim ve OR kombinasyonları Bunu yapabilirim eğer, örneğin) benim val
açıklamaya birden çok koşul ekleyememe esnekliği gibi, bu yüzden bu işlevselliği sürdürmek istiyorsanız .
Çok daha hızlı/verimli bir sonuç elde etmek için data.table birleşimlerini "düzgün" (veya başka bir data.table çözümü) kullanmanın bir yolu var mı?
Çok teşekkürler!
#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: Suçlu olarak suçlanıyor. Kesinlikle haklısın. X + 1 ile X + 1 ızgarası demeliydi ... Tüm Etkinlik noktalarının ızgaraya sığmasını istedim, bu yüzden 0 X ve Y ızgara noktalarını dahil etmeliydim. Bununla birlikte, çözmeye çalıştığım problem bu değişiklikten en az etkilenen ... olayların ve ızgara büyüklüğünün her ikisi de, ikisi de oldukça büyüktür. Düzeltme için teşekkürler. – ColoradoGranite
Değeri ne olursa olsun, bir ölçekten bağımsız olarak her bir boyutta +/- 1'e geçiş yapabiliyorsanız çok daha hızlı olabilir: 'system.time (dtEvents [, { L = lapply (. SD, fonksiyon (x) rep (as.integer (zemin (x)), her biri = 4L)) ( x = L [[1]] + 0: 1, y = L [[2]] + rep (0: 1, her = 2L) ) }, .SDcols = x: y] [, .N, by = x: y]) '. Başlangıçta yaptığınızı sandım. – Frank