繁体   English   中英

如何通过将 R 中按客户 ID 分组的数据框中的较晚日期值除以较早日期来计算数据帧多列的值

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM