R语言实现单/重叠分类下转化与未转化客户唯一计数
R实现多设备重叠场景的转化客户计数
问题说明
需要统计7类场景下的转化、未转化唯一客户数,场景包含:
- 3类单设备场景:App、Desktop、Web
- 4类多设备重叠场景:App & Web、App & Desktop、Web & Desktop、App & Web & Desktop
已知单维度分组计数的aggregate、group_by实现方法,需要解决多设备重叠逻辑的计数问题。
提供的测试数据集:
df <- data.frame(list(ClientID = c("1", "1", "1", "2", "2", "3", "3" , "3" , "3" , "4" ), device = c("App", "Web", "App", "Web", "Web", "App", "Desktop", "App", "App", "Web"), conversion = c("0", "0", "0", "0", "1", "1", "0", "1", "0", "1")) )
期望输出结构:
Scenario With Conversion Without Conversion App Web Desktop App & Web App & Desktop Web & Desktop App & Desktop & Web
实现逻辑
核心思路是先聚合到客户唯一粒度,先拿到每个客户触达的去重设备集合、最终转化状态(同一客户只要存在1条转化记录即判定为转化客户),再按场景规则匹配计数。
步骤1:客户粒度数据聚合
library(dplyr) client_summary <- df %>% group_by(ClientID) %>% summarise( # 对设备去重后排序拼接,避免同组合顺序不一致 device_set = paste(sort(unique(device)), collapse = " & "), # 转化判定:存在任意一条转化记录即为转化客户 is_convert = any(conversion == "1") )
步骤2:按统计口径计数
提供两种常用统计口径的实现,按需选择即可:
口径1:重叠统计(只要客户使用过场景内所有设备即计入,场景间客户可重复)
这个口径符合“重叠场景”的统计需求,比如同时使用App、Web、Desktop的客户,会同时被计入App、Web、Desktop、App&Web、App&Desktop、Web&Desktop、全设备三端7个场景的统计。
# 定义所有待统计场景,按期望顺序排列 scenario_list <- c( "App", "Web", "Desktop", "App & Web", "App & Desktop", "Web & Desktop", "App & Desktop & Web" ) # 初始化结果表 result <- data.frame( Scenario = scenario_list, `With Conversion` = 0, `Without Conversion` = 0, check.names = FALSE ) # 逐场景匹配计数 for (i in seq_along(scenario_list)) { target_dev <- strsplit(scenario_list[i], " & ")[[1]] # 筛选设备集合包含当前场景所有设备的客户 match_client <- client_summary %>% rowwise() %>% filter(all(target_dev %in% strsplit(device_set, " & ")[[1]])) result[i, "With Conversion"] <- sum(match_client$is_convert) result[i, "Without Conversion"] <- sum(!match_client$is_convert) }
基于测试数据集运行后得到的结果:
| Scenario | With Conversion | Without Conversion |
|---|---|---|
| App | 1 | 1 |
| Web | 2 | 1 |
| Desktop | 1 | 0 |
| App & Web | 0 | 1 |
| App & Desktop | 1 | 0 |
| Web & Desktop | 0 | 0 |
| App & Desktop & Web | 0 | 0 |
口径2:互斥统计(客户设备组合与场景完全匹配才计入,场景间客户无重叠)
如果需要各场景客户不重复、加总等于总客户数,用这个口径即可:
library(tidyr) result_exclusive <- client_summary %>% group_by(Scenario = device_set) %>% summarise( `With Conversion` = sum(is_convert), `Without Conversion` = sum(!is_convert), .groups = "drop" ) %>% # 补全无客户的场景,填充0 full_join(data.frame(Scenario = scenario_list), by = "Scenario") %>% mutate( `With Conversion` = replace_na(`With Conversion`, 0), `Without Conversion` = replace_na(`Without Conversion`, 0) ) %>% # 按指定场景顺序排序 arrange(factor(Scenario, levels = scenario_list))
基于测试数据集运行后得到的结果:
| Scenario | With Conversion | Without Conversion |
|---|---|---|
| App | 0 | 0 |
| Web | 2 | 0 |
| Desktop | 0 | 0 |
| App & Web | 0 | 1 |
| App & Desktop | 1 | 0 |
| Web & Desktop | 0 | 0 |
| App & Desktop & Web | 0 | 0 |
内容的提问来源于stack exchange,提问作者viaradio
相关产品推荐
相关产品推荐

