如何在tidyverse管道中实现ARPU列与Day值的一一对应循环?
批量处理ARPU列并匹配对应Day值的tidyverse实现
方法一:长格式转换(推荐,契合tidyverse风格)
无需写显式循环,通过将宽格式数据转成长格式,一次性处理所有ARPU列,自动对应Day值:
# 自动提取所有符合"Day X ARPU"格式的列 arpu_cols <- grep("Day \\d+ ARPU", names(df), value = TRUE) Dftest <- df %>% # 将所有ARPU列转换为两列:列名(arpu_day)和对应数值(arpu_value) pivot_longer(cols = all_of(arpu_cols), names_to = "arpu_day", values_to = "arpu_value") %>% # 从列名中提取Day的数字并转为整数类型 mutate(Day = str_extract(arpu_day, "\\d+") %>% as.integer()) %>% # 计算加权均值的分子项 mutate(Numerator = arpu_value * Installs) %>% # 按platform、source、Day分组计算加权均值 group_by(platform, source, Day) %>% summarise(WeightedMean = sum(Numerator, na.rm = TRUE) / sum(Installs, na.rm = TRUE), .groups = "drop")
这种方法的优势:
- 自动识别所有符合命名规则的ARPU列,无需手动维护列列表
- 规避显式循环,代码简洁易读
- 天然保证ARPU列与Day值的一一对应关系
方法二:显式循环(用map2实现精准对应)
如果需要精确指定待处理的ARPU列及对应Day值,可使用purrr::map2实现批量处理:
# 手动指定ARPU列和对应Day数值(需确保两者顺序完全对应) arpu_cols <- c("Day 7 ARPU", "Day 14 ARPU", "Day 180 ARPU") day_values <- c(7, 14, 180) # 遍历每一组列与Day值,处理后合并结果 Dftest <- purrr::map2_dfr(arpu_cols, day_values, function(col, day) { df %>% mutate(Numerator = .data[[col]] * Installs) %>% group_by(platform, source) %>% summarise(WeightedMean = sum(Numerator, na.rm = TRUE) / sum(Installs, na.rm = TRUE), .groups = "drop") %>% mutate(Day = day) })
注:使用.data[[col]]引用字符串指定的列,可避免tidyeval相关问题,确保代码稳定运行。
内容的提问来源于stack exchange,提问作者BlackPlasma
相关产品推荐
相关产品推荐

