У меня большой набор данных (40 млн. Строк), и я хотел бы сделать 2 вычисления для каждой строки набора данных. (1) как часто человек (с данным идентификатором) инвестировал до этого - временная метка условия <метка времени данной строки и ID == id данной строки (2) кумулятивная сумма, которую человек инвестировал в каждую данную инвестицию - - таким образом, условия те же, что и выше, но суммируют столбец с именем «Значение» вместо подсчета вхождений. Цикл и подмножество фрейма данных было бы вариантом, но это занимает очень много времени, учитывая размер набора данных, поэтому я ищу решение с эффективным использованием ресурсов. Я пытался объединить функцию apply с условным поиском, однако я не могу заставить его работать (см. Попытку ниже). Любая помощь очень ценится. </p>
Пример даты:
timestamp = c("2018-10-04 00:39:02", "2018-10-04 00:50:22", "2018-10-04 03:07:29", "2018-10-04 02:15:57")
ID = c(1,1,2,3)
Value = c(100, 150, 50, 200)
sample = as.data.frame(cbind(timestamp, ID, Value))
sample$timestamp = as.POSIXct(sample$timestamp)
Подход с применением:
sample$prior_investments = apply(sample, 2, function (x) length(which(sample$ID == ID & sample$timestamp < timestamp)))
sample$invested_amount = apply(sample, 2, function (x) sum(which(sample$ID == ID & sample$timestamp < timestamp)))
Желаемый вывод:
timestamp ID Value prior_invest invested_amount
1 2018-10-04 00:39:02 1 100 0 0
2 2018-10-04 00:50:22 1 150 1 100
3 2018-10-04 03:07:29 2 50 0 0
4 2018-10-04 02:15:57 3 200 0 0