Fare un setkey
qui sarebbe costoso (anche se si dovesse utilizzare l'ordine veloce in 1.8.11
), perché deve spostare i dati (per riferimento) pure.
Tuttavia, è possibile aggirare questo caso utilizzando la funzione floor
. In sostanza, se si desidera tutti i numeri in [1,2] (Nota: compresi 1 e 2 qui), quindi floor
fornirà un valore di "1" per tutti questi valori. Cioè, si può fare:
system.time(t1 <- dt[floor(a) == 1])
# user system elapsed
# 0.234 0.001 0.238
Ciò equivale a fare dt[a >= 1 & a <=2]
ed è due volte più veloce.
system.time(t2 <- dt[a >= 1 & a <= 2])
# user system elapsed
# 0.518 0.081 0.601
identical(t1,t2) # [1] TRUE
Tuttavia, dal momento che non si vuole l'uguaglianza, è possibile utilizzare un hack per sottrarre la tolleranza = .Machine$double.eps^0.5
dalla colonna a
. Se il valore è compreso nell'intervallo [1, 1+tolerance)
, significa che è ancora considerato 1. E se è solo di più, non è più 1 (internamente). Cioè, è il numero più piccolo> 1 che la macchina può identificare come non 1. Quindi, se sottrai 'a' per tolleranza tutti i numeri che sono internamente rappresentati come "1" diventeranno < 1 e floor(.)
avranno come risultato 0. Quindi , avrai invece l'intervallo> 1 e < 2. Cioè,
dt[floor(a-.Machine$double.eps^0.5)==1]
darà il risultato equivalente dt[a>1 & a<2]
.
Se hai di fare questo in modo ripetitivo, allora probabilmente la creazione di una nuova colonna con questa funzione floor
e la chiave di impostazione su quella colonna integer
potrebbe aiutare:
dt[, fa := as.integer(floor(a-.Machine$double.eps^0.5))]
system.time(setkey(dt, fa)) # v1.8.11
# user system elapsed
# 0.852 0.158 1.043
Ora, è possibile interrogare qualunque gamma si desidera utilizzare la ricerca binaria:
> system.time(dt[J(1L)]) # equivalent to > 1 & < 2
# user system elapsed
# 0.071 0.002 0.076
> system.time(dt[J(1:4)]) # equivalent to > 1 & < 5
# user system elapsed
# 0.082 0.002 0.085
'between' non salverà in alcun momento perché contiene il codice' x> = lower & x <= upper'. 'dt [a> 1 & a <2]' sarà altrettanto veloce –
che ne dici di usare l'impostazione di una chiave? Ho appena aggiornato la mia domanda non sicuro di poter eseguire una ricerca a distanza su una chiave. – Abhi