如何基于group_by结果将国际市场数据替换为总销售额(国内+国际)?
问题:将国际市场数据替换为对应年份总销售额
用户提供的数据集结构如下:
structure(list(year = c(2012, 2012, 2012, 2012, 2013, 2013, 2013, 2013, 2013, 2014, 2014, 2014, 2014, 2014, 2014, 2015, 2015, 2015, 2015, 2015, 2015, 2015, 2015), market = c("national", "international", "national", "international", "national", "national", "national", "international", "national", "national", "international", "national", "national", "national", "international", "international", "national", "international", "national", "international", "national", "national", "national"), amount = c(253, 123, 165, 265, 216, 65, 214, 416, 67, 156, 563, 327, 200, 392, 690, 135, 160, 89, 50, 206, 199, 50, 57)), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA, -23L))
用户已完成的数据集处理步骤:
df2 <- df |> group_by(year, market) |> summarise(amount=sum(amount))
需求:将上述结果中international(国际市场)的amount值,替换为对应年份的总销售额(国内+国际)。
解决方案
可以借助dplyr的分组计算和条件赋值来实现,以下是两种可行方式:
方式一:基于已生成的df2继续处理
df_final <- df2 %>% # 按年份分组,计算该年份的总销售额 group_by(year) %>% mutate( # 用case_when替换国际市场的数值为年度总和 amount = case_when( market == "international" ~ sum(amount), TRUE ~ amount ) ) %>% # 取消分组,避免后续操作受分组影响 ungroup()
方式二:直接从原数据集一步完成处理
df_final <- df %>% # 先按年份和市场分组,计算各市场年度销售额合计 group_by(year, market) %>% summarise(amount = sum(amount), .groups = "drop") %>% # 再次按年份分组,计算年度总销售额并替换国际市场数据 group_by(year) %>% mutate(amount = ifelse(market == "international", sum(amount), amount)) %>% ungroup()
逻辑说明
- 第一步先按
year和market分组求和,得到每个年份下国内、国际市场的独立销售额合计; - 第二步按
year分组,此时sum(amount)会计算该年份下国内+国际的总销售额; - 通过
case_when或ifelse进行条件判断,将market为international的行的amount替换为该年份的总销售额; - 最后取消分组,确保数据集回到常规结构,方便后续绘制折线图。
内容的提问来源于stack exchange,提问作者daviddupont
相关产品推荐
相关产品推荐

