Итак, я работаю над проектом, в котором есть несколько таблиц данных, разделенных по месяцам, которые мне нужно перебирать. Скорость здесь имеет существенное значение, и я не могу сократить время до чего-то разумного, если я не сделаю много перекрестных соединений через функции таблиц данных. Итак, вот мои таблицы:
ТАБЛИЦА 1
Product Date Cost
A 8/1/2020 10
A 8/2/2020 20
A 8/3/2020 30
B 8/4/2020 15
B 8/5/2020 25
B 8/6/2020 35
и ТАБЛИЦА 2:
Product Date Price
A 9/1/2020 20
A 9/2/2020 30
A 9/3/2020 40
B 9/4/2020 27
B 9/5/2020 33
B 9/6/2020 42
Поэтому мне нужно перебрать каждую комбинацию из Таблицы 2 Цена - Таблица 1 Стоимость, и делайте это по Продуктам. Таким образом, вывод будет:
НОВАЯ ТАБЛИЦА
Product Date1 Date2 Profit
A 8/1/2020 9/1/2020 10
A 8/1/2020 9/2/2020 20
...
РЕДАКТИРОВАТЬ: Чтобы уточнить, новая таблица должна продолжаться. Продукт A должен иметь 27 различных прибылей (3 даты под A x 3 даты под ставкой дисконтирования A x 3) при условии, что все они выше 0. Если какая-либо из прибылей ниже 0, то я не хочу, чтобы они были частью Нового Таблица.
У меня также есть коэффициент скидки, который мне нужно применить к каждой перестановке цены, поскольку мы даем довольно небольшие скидки
Discount = c(10%,12%,18%)
Я пробовал использовать al oop и различные способы использования применяются, но циклы занимают слишком много времени, чтобы завершить sh (часов, а некоторые никогда не делают). Комбинации приводят к миллионам строк, но я хочу сохранить только прибыльные, где Цена * Скидка> Стоимость, которых может быть всего 10000.
Мое решение - перекрестное соединение таблиц данных для создания массивная таблица, которую я могу векторизовать, что намного быстрее (около 1 минуты), но с некоторыми большими таблицами я быстро сталкиваюсь с ограничениями памяти, и это не очень масштабируемое.
CTbl =setkey(CTbl[,c(k=1,.SD)],k)[Price[,c(k=1,.SD)],allow.cartesian=TRUE][,k:=NULL]
CTbl[,Profit:=(Discount*Price - Cost]
CTbl = setDT(CTbl)[, .SD[Price > Cost ]]
DT = CTbl[,list(MinProfit = min(Profit)),by = Product]
Конечно, это работает довольно быстро, но это огромная трата памяти, когда все, что мне действительно нужно, это прибыльные строки и, конечно, постоянная проблема с памятью.
Кто-нибудь может помочь? Я спрашивал некоторых пользователей R на работе, но они тоже казались сбитыми с толку: созданные ими циклы не могли приблизиться к менее чем 5 минутам, необходимым для выполнения вышеуказанного. Я не возражаю, если это означает, что я могу увеличить масштаб.
Спасибо!