在R中基于列名聚合表格行:去重与多聚合操作实现问题
处理网页访问数据的去重与聚合需求
需求说明
- 按
yearMonth和page列分组去重 - 对
users和sessions列执行求和操作 - 对
bounceRate列,支持两种处理方式:- 选取同组内
sessions数值最大的行对应的bounceRate值 - 按
sessions为权重计算bounceRate的加权平均值
- 选取同组内
示例数据
data <- data.frame( yearMonth = c(202405, 202406, 202405), page = c("a.html", "b.html", "a.html"), users = c(20, 14, 2), sessions = c(22, 16, 3), bounceRate = c(0.48, 0.52, 0.90) )
原代码问题分析
原aggregate函数的逻辑存在两处错误:
- 分组处理时,
x是单列数据,不存在names(x),无法通过any(names(x) == "bounceRate")判断列名 which.max(data$Sessions)是取整个数据集的最大会话数,而非当前分组内的最大值,导致结果错误
解决方案
方案1:取分组内会话数最多的bounceRate
使用dplyr包实现,逻辑清晰直观:
library(dplyr) result_max_session <- data %>% group_by(yearMonth, page) %>% summarise( users = sum(users), sessions = sum(sessions), bounceRate = bounceRate[which.max(sessions)] ) %>% ungroup() print(result_max_session)
输出结果:
# A tibble: 2 × 5 yearMonth page users sessions bounceRate <dbl> <chr> <dbl> <dbl> <dbl> 1 202405 a.html 22 25 0.48 2 202406 b.html 14 16 0.52
方案2:计算bounceRate的加权平均值
按sessions作为权重,计算分组内的加权平均跳出率:
result_weighted <- data %>% group_by(yearMonth, page) %>% summarise( users = sum(users), sessions = sum(sessions), bounceRate = weighted.mean(bounceRate, sessions) ) %>% ungroup() print(result_weighted)
输出结果:
# A tibble: 2 × 5 yearMonth page users sessions bounceRate <dbl> <chr> <dbl> <dbl> <dbl> 1 202405 a.html 22 25 0.54 2 202406 b.html 14 16 0.52
Base R 实现(无需额外包)
如果不想使用dplyr,可以用by函数实现分组处理:
result_base_max <- do.call(rbind, by(data, list(data$yearMonth, data$page), function(g) { data.frame( yearMonth = unique(g$yearMonth), page = unique(g$page), users = sum(g$users), sessions = sum(g$sessions), bounceRate = g$bounceRate[which.max(g$sessions)] ) })) rownames(result_base_max) <- NULL print(result_base_max)
内容的提问来源于stack exchange,提问作者Nelie
相关产品推荐
相关产品推荐

