У меня есть два больших отдельных кадра данных, отслеживающих совокупные транзакции в определенных элементах. Df1 следует этой структуре:
structure(list(NAME = c("Stock 2014", "Stock 2014", "Stock 2014",
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014",
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014",
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014",
"Stock 2014", "Stock 2014"), Transaction_DATE = structure(c(11893,
11983, 12167, 12216, 12263, 12893, 13075, 13894, 13985, 14174,
14265, 14405, 14540, 14778, 14855, 15266, 15478, 15538, 15562,
15666), class = "Date"), TRANSACTION = c(2800, 2750, 2500, 2500,
2500, 360, 289, 135, 405, 1845, 1602, 5490.409, 4880.86, 4399.53,
4122.574, 793, 1500, 539, 1500, -332.3), Termination_DATE = structure(c(16320,
16320, 16320, 16320, 16320, 16320, 16320, 16320, 16320, 16320,
16320, 16320, 16320, 16320, 16320, 16320, 16320, 16320, 16320,
16320), class = "Date")), row.names = c(NA, -20L), class = c("tbl_df",
"tbl", "data.frame"))
Df1 является основным фреймом данных для этой задачи и отслеживает товары, которые были доступны для продажи (обозначаются столбцом «ТРАНЗАКЦИЯ»). «ТРАНЗАКЦИЯ» не является агрегированным столбцом (и в действительности он не представляет транзакцию), он просто представляет новые выпуски «Акции 2014», которые были доступны для продажи на каждую дату; таким образом, первая запись была первой, когда товар был доступен для продажи покупателям. По состоянию на 23 октября 2002 г. для продажи было доступно еще 2750 000 автомобилей (вместе с первоначальными 2800 000, доступными 25 июля 2002 г.).
Termination_DATE представляет собой дату, когда товар больше не продается, и поэтому данные временного ряда должны заканчиваться на этой дате.
Df2 представляет собой количество продаж, сделанных клиентами в каждую дату:
structure(list(Date = structure(c(1236729600, 1237334400, 1237939200,
1238544000, 1239148800, 1239753600, 1240272000, 1240963200, 1241568000,
1242172800, 1242777600, 1243382400, 1245196800, 1245801600, 1257897600,
1259107200, 1260230400, 1262736000, 1263945600), tzone = "UTC", class = c("POSIXct",
"POSIXt")), NAME = c("Stock 2014", "Stock 2014", "Stock 2014",
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014",
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014",
"Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014", "Stock 2014",
"Stock 2014"), Proceeds = c(4078.501279, 4250.769106, 336.426711,
1015.964789, 1482.626306, 2419.852908, 6371.6269, 3901.862847,
964.90766, 7455.621856, 2511.91081, 2233.596381, 2658.115097,
2177.589872, 128.715088, 923.391173, 67.389718, 916.832833, 113.312322
)), row.names = c(NA, -19L), class = c("tbl_df", "tbl", "data.frame"
))
«Выручка» представляет транзакцию.
Итак, что я хочу сделать, так это создать временную шкалу чистых непроданных товаров каждого товара в виде временного ряда между первой ДАтой транзакции в df1 и датой завершения_DATE, тем самым принимая во внимание дату и транзакции, указанные в df2.
Есть ли у кого-нибудь какие-либо советы о том, как этого добиться (извините, если неясно, английский не является родным языком).
Обновлено: я, вероятно, должен упомянуть, что для продажи доступен не только один предмет (это большой фрейм данных, содержащий больше предметов, чем просто «Акции 2014», поэтому решение должно учитывать это).
EDIT2: исправлена странная ошибка вывода dput.
Вы можете связать свои кадры данных вместе, сделать Proceeds
отрицательным и вычислить кумулятивную сумму, чтобы получить текущую чистую сумму.
NB, лучше предоставить примеры данных, которые охватывают все ваши требования. Я добавил второй NAME
к вашим данным, чтобы учесть требование нескольких элементов.
library(dplyr)
library(ggplot2)
df_both <- df2 %>%
mutate(
Transaction_DATE = as.Date(Date),
TRANSACTION = -1 * Proceeds,
.keep = "unused"
) %>%
bind_rows(df1) %>%
arrange(NAME, Transaction_DATE) %>%
group_by(NAME) %>%
mutate(Net_Unsold = cumsum(TRANSACTION)) %>%
ungroup()
ggplot(df_both, aes(Transaction_DATE, Net_Unsold)) +
geom_hline(yintercept = 0, size = .25, color = "gray30") +
geom_line(aes(color = NAME)) +
scale_x_date(date_breaks = "year", date_labels = "%Y") +
theme_minimal()
Расширенные данные примера:
set.seed(13)
df1 <- bind_rows(
df1,
mutate(
df1,
NAME = "Stock 2015",
Transaction_DATE = Transaction_DATE + 365,
Termination_DATE = Termination_DATE + 365,
TRANSACTION = TRANSACTION + rnorm(n(), sd = 500)
)
)
df2 <- bind_rows(
df2,
mutate(
df2,
NAME = "Stock 2015",
Date = Date + 365,
Proceeds = Proceeds + rnorm(n(), sd = 500)
)
)
Спасибо за это, это работает для добавленных df1 и df2, но не работает для гораздо большего df. Единственная причина, по которой я дал урезанную версию, была из-за размера dfs (df1 - 2 КБ, а df2 - 7,6 КБ).