You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:25:16