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

在R中基于独立求和创建主/次维度字段的技术求助

按账户维度生成主/次维度字段解决方案

需求说明

基于月度粒度数据集(包含accountID、consumption、date、platform、type、type_2字段),为每个accountID生成以下字段:

  • 主字段:primary_platform、primary_type、primary_type_2,分别对应各维度下消费总和最高的值
  • 次字段:secondary_platform、secondary_type、secondary_type_2,分别对应各维度下消费总和第二高的值
    要求三个维度独立计算(非组合维度),最终每个accountID仅保留一条记录。

现有方案问题分析

  1. 重复分组拼接法:需对每个维度单独分组求和、筛选最大值,后续手动拼接数据,工作量大且易出错
  2. 直接which.max法:错误使用单条记录的consumption最大值(而非维度分组求和后的最大值),且Databricks分布式环境不支持platform[which.max(...)]这类本地向量索引操作,导致代码失效

可行解决方案

方法1:分维度处理后合并(基础版)

通过分组求和、排名、转宽表,分别处理三个维度后合并结果,逻辑清晰且兼容Databricks环境:

步骤1:处理Platform维度

# 计算每个账户-平台的总消费,按消费降序排名,保留前2名并转宽表
platform_rank <- my_data %>%
  group_by(accountID, platform) %>%
  summarize(total_consumption = sum(consumption), .groups = "drop") %>%
  group_by(accountID) %>%
  mutate(rank = row_number(desc(total_consumption))) %>%
  filter(rank %in% c(1, 2)) %>%
  pivot_wider(
    id_cols = accountID,
    names_from = rank,
    values_from = platform,
    names_prefix = "platform_rank_"
  ) %>%
  rename(primary_platform = platform_rank_1, secondary_platform = platform_rank_2)

步骤2:处理Type维度

type_rank <- my_data %>%
  group_by(accountID, type) %>%
  summarize(total_consumption = sum(consumption), .groups = "drop") %>%
  group_by(accountID) %>%
  mutate(rank = row_number(desc(total_consumption))) %>%
  filter(rank %in% c(1, 2)) %>%
  pivot_wider(
    id_cols = accountID,
    names_from = rank,
    values_from = type,
    names_prefix = "type_rank_"
  ) %>%
  rename(primary_type = type_rank_1, secondary_type = type_rank_2)

步骤3:处理Type_2维度

type2_rank <- my_data %>%
  group_by(accountID, type_2) %>%
  summarize(total_consumption = sum(consumption), .groups = "drop") %>%
  group_by(accountID) %>%
  mutate(rank = row_number(desc(total_consumption))) %>%
  filter(rank %in% c(1, 2)) %>%
  pivot_wider(
    id_cols = accountID,
    names_from = rank,
    values_from = type_2,
    names_prefix = "type2_rank_"
  ) %>%
  rename(primary_type_2 = type2_rank_1, secondary_type_2 = type2_rank_2)

步骤4:合并所有结果

final_result <- platform_rank %>%
  left_join(type_rank, by = "accountID") %>%
  left_join(type2_rank, by = "accountID")

方法2:批量处理优化版(进阶)

使用purrr包批量处理三个维度,减少重复代码,提升可维护性:

library(purrr)
library(dplyr)

# 定义通用维度处理函数
process_dimension <- function(data, dimension_col) {
  data %>%
    group_by(accountID, {{dimension_col}}) %>%
    summarize(total_consumption = sum(consumption), .groups = "drop") %>%
    group_by(accountID) %>%
    mutate(rank = row_number(desc(total_consumption))) %>%
    filter(rank %in% c(1, 2)) %>%
    pivot_wider(
      id_cols = accountID,
      names_from = rank,
      values_from = {{dimension_col}},
      names_glue = "{.col}_rank_{rank}"
    ) %>%
    # 重命名为目标字段名
    rename_with(~ gsub("_rank_1", "_primary", .x), matches("_rank_1")) %>%
    rename_with(~ gsub("_rank_2", "_secondary", .x), matches("_rank_2"))
}

# 批量处理三个维度
dimension_list <- map(c("platform", "type", "type_2"), ~ process_dimension(my_data, .x))

# 合并所有维度结果
final_result <- reduce(dimension_list, left_join, by = "accountID")

关键说明

  • 使用row_number(desc(total_consumption))确保按维度分组后的总消费排名,而非单条记录消费
  • pivot_wider将长表转宽表,直接生成主/次字段
  • 代码兼容Databricks的SparkR环境(需确保已加载dplyr/sparklyr相关包)

内容的提问来源于stack exchange,提问作者Edmonds15

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 05:50:34