Korzystanie z nowo wdrożonego n na equi przyłącza się do aktualnej wersji rozwojowej, można to osiągnąć w prosty sposób, jak następuje:
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
Numer wiersza jest konieczne, ponieważ musimy znaleźć wskaźniki niższe niż bieżący indeks, stąd musi być stan w złączeniu. Wykonujemy samołączenie , tj. Dla każdego wiersza w DT
(wewnętrznym), w oparciu o warunek dostarczony do argumentu on
, znajdujemy pierwszy zgodny indeks wiersza w DT
(zewnętrzny). Następnie odejmujemy indeksy wierszy, aby uzyskać pozycję z bieżącego wiersza. x.row
odnosi się do indeksu zewnętrznego DT
i i.row
do wewnętrznego DT
.
Aby uzyskać wersję devel, patrz instrukcja instalacji here.
Na rzędach 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 to świetnie @jeremycg, i upewnić się, że rozumieją to dobrze, jeśli chciałem sprawdzić co row wartość Temp poszedł niższa niż kolumny alternatywnego (dodatkowa kolumna) wartość, w jaki sposób zmieni się ta metoda? Dziękuję – user3740289
Bez problemu. Zmienisz wartość '. $ Temp [x: length (. $ Temp)] na'. $ Additionalcolumn [x: length (. $ Temp)] '. – jeremycg
Niestety ta (i moja własna usunięta odpowiedź) wydaje się być równie powolna jak mokry tydzień. Nawet w przypadku 100 000 zajmuje to chwilę. Myślę, że musi istnieć sposób obejścia tego poprzez niektóre sprzężenia lub coś podstępnego. Arun, gdzie jesteś ?! – thelatemail