【发布时间】:2019-12-20 08:09:51
【问题描述】:
假设我在 R 中有以下小标题:
activation_date | country | campaign | revenue | users
======================================================
1 | 1 | 1 | R_1 | U_1
2 | 1 | 1 | R_2 | U_2
3 | 1 | 1 | R_3 | U_3
1 | 1 | 2 | R_4 | U_4
2 | 1 | 2 | R_5 | U_5
3 | 1 | 2 | R_6 | U_6
1 | 2 | 3 | R_7 | U_7
2 | 2 | 3 | R_8 | U_8
3 | 2 | 3 | R_9 | U_9
我想按国家/地区对这个 tibble 进行分组并汇总其数据以将此 tibble 作为其输出:
country | campaign | ltv
==========================
1 | 1 | ltv_1
1 | 2 | ltv_2
2 | 3 | ltv_3
但是,我希望ltv_1 和 ltv_2 使用所有R_1 到R_6 和U_1 到U_6 来联合计算,并且ltv_3使用R_7 到R_9 和U_7 到U_9 进行计算。
我不能 group_by "country" 和 summarise,因为这会删除我想保留的 "campaign" 列,但我不能 group_by "country" 和 "campaign"要么是因为那样我将无法使用前三行来帮助计算ltv_2,也无法使用后三行来帮助计算ltv_1。
一种可能的方法是按“国家”分组并使用group_modify 函数生成分组的输出小标题。但是,该功能处于“实验”阶段,因此我不想过分依赖它。有没有其他既定的方法来做到这一点?
一个示例输入小标题是:
# A tibble: 9 x 5
activation_date country campaign revenue users
<dbl> <dbl> <dbl> <dbl> <dbl>
1 1 1 1 1 11
2 2 1 1 2 12
3 3 1 1 3 13
4 1 1 2 4 14
5 2 1 2 5 15
6 3 1 2 6 16
7 1 2 3 7 17
8 2 2 3 8 18
9 3 2 3 9 19
它的输出是:
# A tibble: 3 x 3
country campaign ltv
<dbl> <dbl> <dbl>
1 1 1 0.213
2 1 2 0.296
3 2 3 0.444
使用生成它的代码,使用group_modify 函数,是:
test_tibble = tribble (~ activation_date, ~ country, ~ campaign, ~ revenue, ~ users,
1, 1, 1, 1, 11,
2, 1, 1, 2, 12,
3, 1, 1, 3, 13,
1, 1, 2, 4, 14,
2, 1, 2, 5, 15,
3, 1, 2, 6, 16,
1, 2, 3, 7, 17,
2, 2, 3, 8, 18,
3, 2, 3, 9, 19)
test_function = function (activation_date, campaign, revenue, users) {
total_ltv = sum (revenue) / sum (users)
campaign_ltv = double (0)
campaign_names = unique (campaign)
for (c in campaign_names) {
campaign_ltv = c (campaign_ltv, sum (revenue [campaign == c]) / sum (users [campaign == c]))
}
return (tibble (campaign = campaign_names,
ltv = campaign_ltv / 2 + total_ltv / 2))
}
test_tibble %>%
group_by (country) %>%
group_modify (~ test_function (.x$activation_date, .x$campaign, .x$revenue, .x$users)) %>%
ungroup
【问题讨论】:
-
ltv计算是什么?此外,如果您为revenue输入一些数字会更好。理想情况下,您的示例数据结构应该代表您的实际数据结构。 -
我可以输入一些虚构的数字,但为什么实际值或实际计算很重要?
ltv_1必须是R_1到U_6的函数,ltv_2也必须是R_1到U_6的函数,它们可能是也可能不是相同的函数,所以让我们假设 w.l.o.g.他们不是,我该怎么做? -
这很重要,因为结果更容易验证。
-
很公平,我在问题中添加了一个示例。
-
我建议,如果您不想使用
group_modify(我同意这是这里的自然选择),您可以使用split和purrr::map_dfr