首页 > 解决方案 > 尝试计算 R 中的保留率,如何将同一日期的一行除以另一行,然后在整个数据帧中应用相同的逻辑?

问题描述

我正在尝试计算同一日期内 Instagram 故事的保留率(最后一帧的观众人数除以第一帧的观众人数)。我在 R 中的数据框中有这些数据,其中每一帧都列为一行,并且具有相同日期的任何帧构成了该日期的整个故事。我很难弄清楚如何在同一日期内获取第一帧和最后一帧的索引,然后将它们分开,然后将其应用于数据帧的其余部分?任何帮助将不胜感激!

标签: rdaterow

解决方案


由于您没有提供您的数据或可重复的示例,我将不得不做出一些假设。首先,我需要尝试根据您的描述重新创建您的数据框。听起来它看起来像这样:

df
#>        dates views
#> 1  2020-01-01    32
#> 2  2020-01-01    28
#> 3  2020-01-01    28
#> 4  2020-01-01    28
#> 5  2020-01-02    28
#> 6  2020-01-02    26
#> 7  2020-01-02    26
#> 8  2020-01-02    25
#> 9  2020-01-03    25
#> 10 2020-01-03    25
#> 11 2020-01-03    25
#> 12 2020-01-03    25
#> 13 2020-01-04    23
#> 14 2020-01-04    20
#> 15 2020-01-04    20
#> 16 2020-01-04    20
#> 17 2020-01-05    18
#> 18 2020-01-05    17
#> 19 2020-01-05    17
#> 20 2020-01-05    17
#> 21 2020-01-06    15
#> 22 2020-01-06    13
#> 23 2020-01-06    12
#> 24 2020-01-06    10

因此,当然,以下代码仅在您替换df数据框的名称和dates适当views的列名称时才有效。我还将假设每个日期组中的条目从最早到最晚排序,因为这就是您的问题所暗示的。如果是这种情况,那么您可以这样做:

result <- do.call("rbind", lapply(split.data.frame(df, df$dates), function(x){
  data.frame(date = x$dates[1], retention = x$views[nrow(x)] / x$views[1])}))
rownames(result) <- 1:nrow(result)

这给了你这个:

result
#>         date retention
#> 1 2020-01-01 0.8750000
#> 2 2020-01-02 0.8928571
#> 3 2020-01-03 1.0000000
#> 4 2020-01-04 0.8695652
#> 5 2020-01-05 0.9444444
#> 6 2020-01-06 0.6666667

推荐阅读