[英]how to compute values of multiple columns of a data frame by dividing values on later date by earlier date in a data frame in R grouped by customer id
我有一个数据框,其中包含日期列、客户 ID 以及每个日期和客户 ID 的唯一组合的 9 个不同指标。 我有一周的数据:“2020-04-05”到“2020-04-12”。 我需要在周日为每个客户计算每个变量的增长率,即“2020-04-12”每个客户的指标值除以“2020-04-05”每个客户的指标值并使用该百分比百分比增长率来计算下周一、周二和周三的指标值,作为下一个周一的 metric1..metric9 的值 = metric1{previous_monday]* 每个客户的增长率。 这需要在下周二和周三发生,也需要根据前一周的周二和周三进行。示例数据框如下:
p <- seq(0,100, by =1)
df <- data.frame(Customer_ID = p)
df_1 <- df %>%
group_by(Customer_ID) %>%
do( data.frame(., Date= seq(as.Date('2020-04-05'),as.Date('2020-04-12'), by = '1 day')))
df_1$metric_1 <- seq(200,300,by=1)
df_1$metric_2 <- seq(400,500,by=1)
df_1$metric_3 <- seq(600,700,by=1)
作为计算增长率值的第一步,我尝试了这个:
df1_change <- df_1 %>% dplyr::group_by(Customer_ID) %>% dplyr::mutate(metric1_change = ifelse(day_of_week == 'Sunday' & Date == '2020-04-12',
df_1$metric_1[df_1$Date == '2020-04-12']/df_1$metric_1[df_1$Date == '2020-04-05'],"NA"))
但我没有得到正确的增长百分比。 我相信这是完成所有步骤的更优雅的方式。
添加几行样本数据框和几行预期输出(显示为计算值):
Customer_ID Date metric_1 metric_2 metric_3 day_of_week
0 2020-04-05 200 400 600 Sunday
0 2020-04-06 201 401 601 Monday
0 2020-04-07 202 402 602 Tuesday
0 2020-04-08 203 403 603 Wednesday
0 2020-04-09 204 404 604 Thursday
0 2020-04-10 205 405 605 Friday
0 2020-04-11 206 406 606 Saturday
0 2020-04-12 207 407 607 Sunday
0 2020-04-13 (207/200)*201 (407/400)*401 (607/600)*601 Monday
0 2020-04-15 (207/200)*202 (407/400)*402 (607/600)*602 Tuesday
0 2020-04-16 (207/200)*203 (407/400)*403 (607/600)*603 Wednesday
您的 customer_ID 和 Date 逻辑有问题。 结果,1 位客户只有 1 个日期。 但是这样的事情应该适用于您的场景。
df_2 <- df_1 %>%
pivot_longer(names_to = "Metrics", values_to = "value", cols = metric_1:metric_3) %>%
group_by(Customer_ID, Metrics) %>%
arrange(Date) %>%
mutate(value_prev = lag(value, 1),
improv = value / value_prev) %>%
pivot_wider(names_from = Date, values_from = value) %>%
mutate(new_period1 = Date * improv,
new_period2 = new_period1 * improv)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.