У меня есть большая таблица данных (~ 41 млн. Строк * 20+ столбцов), и я хочу выполнить построчное вычисление с учетом результатов в других строках таблицы данных. В частности, я хочу сделать для расчетов. (1) Рассчитать количество транзакций продажи (идентификатор в from_ID), определенный c ID (идентификатор col), сделанный во время каждой транзакции покупки (timestamp) (2) сумма общего объема продаж (значение col // // from_ID) идентификатор, сделанный во время каждой транзакции покупки (идентификатор col)
У меня есть решение, которое работает, однако оно довольно неэффективно и медленно. Мне интересно, есть ли более быстрое / более эффективное (вероятно) решение на основе data.table для этой проблемы.
Вот мой воспроизводимый пример, столбцы, которые я хочу вычислить, это «предыдущие продажи» и «сумма предыдущих продаж»:
Данные
timestamp = c(
"2018-04-04 00:39:02", "2018-06-04 00:50:22", "2018-09-04 03:07:29",
"2018-12-04 02:15:57", "2018-08-04 02:15:57", "2018-09-04 02:15:57",
"2018-10-04 02:15:57", "2018-12-20 02:15:57"
)
ID = as.character(c(1,1,1,1,10,9,8,7))
from_ID = as.character(c(4,5,4,8,1,1,1,1))
Value = c(100,150,50,200,50,100,150,40)
data_sample = as.data.frame(cbind(timestamp, ID, from_ID,Value), stringsAsFactors = F)
data_sample$timestamp = as.POSIXct(data_sample$timestamp)
data_sample$Value = as.numeric(data_sample$Value)
# Approach
prior_sales = data.frame()
prior_sales_amount = data.frame()
for (i in 1:nrow(data_sample)) {
row = data_sample[i,]
sales = subset(data_sample, data_sample$from_ID == row$ID & data_sample$timestamp < row$timestamp)
prior_s = nrow(sales)
prior_sales = rbind(prior_sales, prior_s)
prior_s_a = ifelse(prior_s == 0, 0, sum(sales$Value))
prior_sales_amount = rbind(prior_sales_amount, prior_s_a)
}
data_sample = cbind(data_sample, prior_sales, prior_sales_amount)