Как эффективно определить максимальную разницу между значением переменной в каждой строке и той же переменной в последующих значениях строки в data.table в R

Привет, парень может помочь вам

$.each($("[name=amounter]"), function (index, data) {
                                     
 console.log($("[name=amounter]:eq("+index+")").val());
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<label>Amount1</label>
<div class="col-md-10">
<input type="text" name="amounter" id="amounter_@1" required value="data1" />
</div>

<label>Amount2</label>
<div class="col-md-10">
<input type="text" name="amounter" id="amounter_@2" required value="data2" />
</div>


<label>Amount3</label>
<div class="col-md-10">
<input type="text" name="amounter" id="amounter_@3" required  value="data3"/>
</div>

3
задан Georgie Shimanovsky 19 January 2019 в 23:59
поделиться

1 ответ

Вот решение dplyr, которое примерно в 20 раз быстрее и дает те же результаты. Я предполагаю, что аналог data.table будет еще быстрее. (РЕДАКТИРОВАТЬ: см. Снизу - это так!)

Ускорение происходит за счет уменьшения количества сравнений, которые необходимо выполнить. Наибольшее различие всегда будет найдено по отношению к наибольшему оставшемуся числу в группе, поэтому быстрее сначала идентифицировать это число и выполнить только одно вычитание на строку.

Во-первых, исходное решение на моей машине занимает около 4 секунд:

tictoc::tic("OP data.table") 
dt[, max_diff := vapply(1:.N, function(x) max(X[x:.N] - X[x]), numeric(1)), by = Y]
tictoc::toc()
# OP data.table: 4.594 sec elapsed

Но всего за 0,2 секунды мы можем взять эту таблицу данных, преобразовать ее во фрейм данных, добавить строку orig_row число, сгруппировать по Y, обратная сортировка по orig_row, взять разницу между X и кумулятивным максимумом X, разгруппировать и перегруппировать в исходном порядке:

library(dplyr)
tictoc::tic("dplyr") 
dt2 <- dt %>% 
  as_data_frame() %>%
  mutate(orig_row = row_number()) %>%

  group_by(Y) %>%
  arrange(-orig_row) %>%
  mutate(max_diff2 = cummax(X) - X) %>%
  ungroup() %>%
  arrange(orig_row)
tictoc::toc()
# dplyr: 0.166 sec elapsed

all.equal(dt2$max_diff, dt2$max_diff2)
#[1] TRUE

РЕДАКТИРОВАТЬ: как предлагает @ david-arenburg в комментариях это можно сделать молниеносно в data.table с помощью элегантной строки:

dt[.N:1, max_diff2 := cummax(X) - X, by = Y]

На моем компьютере это примерно в 2-4 раза быстрее, чем решение dplyr выше.

0
ответ дан Jon Spring 19 January 2019 в 23:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: