Utilizzo della nuova implementazione n on-equi unisce nella versione di sviluppo attuale, questo può essere realizzato in modo semplice come segue:
require(data.table) # v1.9.7+
DT[, row := .I] # add row numbers
DT[DT, x.row-i.row, on = .(row > row, Temp < Temp), mult="first"]
# [1] 5 1 3 2 1 NA 3 1 1 NA
Il numero di riga è necessaria poiché occorre trovare indici inferiori l'indice corrente, quindi deve essere una condizione nel join. Eseguiamo un auto join , ad esempio per ogni riga in DT
(interna), in base alle condizioni fornite all'argomento on
, troviamo il primo indice di riga corrispondente in DT
(esterno). Quindi sottraiamo gli indici di riga per ottenere la posizione dalla riga corrente. x.row
si riferisce all'indice esterno DT
e i.row
al numero interno DT
.
Per ottenere la versione di sviluppo, consultare le istruzioni di installazione here.
sulle righe 1E5:
set.seed(123)
DT <- data.table(Temp = runif(1e5L, 0L, 20L))
DT[, row := .I]
system.time({
ans = DT[DT, x.row-i.row, on = .(row > row, Temp < Temp), mult="first", verbose=TRUE]
})
# Non-equi join operators detected ...
# forder took ... 0.001 secs
# Generating non-equi group ids ... done in 0.452 secs
# Recomputing forder with non-equi ids ... done in 0.001 secs
# Found 623 non-equi group(s) ...
# Starting bmerge ...done in 8.118 secs
# Detected that j uses these columns: x.row,i.row
# user system elapsed
# 8.492 0.038 8.577
head(ans)
# [1] 5 1 3 2 1 12
tail(ans)
# [1] 2 1 1 2 1 NA
Ok che è grande @jeremycg, e per rendere sicuro di aver capito bene se volevo controllare che riga il valore Temp è andato inferiore a una colonna alternativa (colonna aggiuntiva) valore come cambierebbe questo metodo? Grazie – user3740289
Nessun problema. Si cambierebbe '. $ Temp [x: length (. $ Temp)] a'. $ Additionalcolumn [x: length (. $ Temp)] '. – jeremycg
Purtroppo questo (e la mia risposta cancellata) sembrano essere lenti come una settimana bagnata. Anche su 100K casi, questo sta prendendo un minuto più. Penso che ci debba essere un modo per aggirare questo attraverso alcuni join o qualcosa di difficile. Arun, dove sei ?! – thelatemail