Плавление данных по диапазону дат
Я сталкиваюсь с проблемой данных RStudio относительно правильного таяния данных. В настоящее время он находится в следующей форме:
Кампания, идентификатор, дата начала, дата окончания, общее количество дней, общее количество расходов, общее количество показов, общее количество конверсий
Я хотел бы, чтобы мои данные выглядели следующим образом:
Кампания, идентификатор, дата, расходы, показы, конверсии
Каждая "дата" должна содержать определенный день, когда была проведена кампания, в то время как расходы, показы и конверсии должны равняться соответственно Общее количество расходов / Общее количество дней, Общее количество показов / Общее количество дней и Общее количество конверсий / Общее количество дней.
Я работаю в RStudio, поэтому решение в R необходимо. У кого-нибудь есть опыт манипулирования такими данными?
1 ответ
Это работает, но это не особенно эффективно. Если ваши данные содержат миллионы строк или более, мне больше повезло с использованием SQL и объединений неравенства.
library(tidyverse)
#create some bogus data
data <- data.frame(ID = 1:10,
StartDate = sample(seq.Date(as.Date("2018-01-01"), as.Date("2018-12-31"), "day"), 10),
Total = runif(10)) %>%
mutate(EndDate = StartDate + floor(runif(10) * 14))
#generate all dates between the min and max in the dataset
AllDates = data.frame(Date = seq.Date(min(data$StartDate), max(data$EndDate), "day"),
Dummy = TRUE)
#join via a dummy variable to add rows for all dates to every ID
data %>%
mutate(Dummy = TRUE) %>%
inner_join(AllDates, by = c("Dummy" = "Dummy")) %>%
#filter to just the dates between the start and end
filter(Date >= StartDate, Date <= EndDate) %>%
#divide the total by the number of days
group_by(ID) %>%
mutate(TotalPerDay = Total / n()) %>%
select(ID, Date, TotalPerDay)
# A tibble: 91 x 3
# Groups: ID [10]
ID Date TotalPerDay
<int> <date> <dbl>
1 1 2018-06-21 0.00863
2 1 2018-06-22 0.00863
3 1 2018-06-23 0.00863
4 1 2018-06-24 0.00863
5 1 2018-06-25 0.00863
6 1 2018-06-26 0.00863
7 1 2018-06-27 0.00863
8 1 2018-06-28 0.00863
9 1 2018-06-29 0.00863
10 1 2018-06-30 0.00863
# ... with 81 more rows