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

R语言如何正确使用summarise实现货运数据分组统计绘图?

问题根因

你写的第二段代码有两个核心错误:

  • 管道运算符优先级错误:%>%的运算优先级高于算术除法,你写的n /sum(n) %>% factor() %>% fct_reorder(share)实际执行逻辑是「先对sum(n)的结果做因子转换、重排序,再用n除以这个转换后的因子值」,完全不符合计算占比的预期。
  • 因子重排对象错误:fct_reorder是用来重排分类自变量(也就是这里的origin_name国家列)的,你写的逻辑试图重排连续值的share列,本身逻辑就不成立,而且你也没有在绘图映射里对x轴分类做排序,最终出图不会按货运量升序排列。
    另外这段代码也没有加入你需要的Top10国家筛选逻辑。
修正后可直接运行的代码

修正后的代码会自动完成空值过滤、国家维度总货运量汇总、占比计算、Top10国家筛选、x轴按总货运量升序排列、绘图全流程:

library(tidyverse)

df_new %>% 
  # 先过滤空值
  filter(!is.na(Freight_weight), !is.na(origin_name)) %>%
  # 按国家分组汇总总货运量
  group_by(origin_name) %>% 
  summarise(total_freight = sum(Freight_weight, na.rm = TRUE)) %>% 
  ungroup() %>%
  # 计算货运量占比,同时将国家转为因子按总货运量升序排序,保证绘图x轴顺序正确
  mutate(share = total_freight / sum(total_freight),
         origin_name = fct_reorder(origin_name, total_freight, .desc = FALSE)) %>%
  # 筛选总货运量Top10的国家,with_ties = FALSE表示遇到并列第10时只取前10条
  slice_max(n = 10, order_by = total_freight, with_ties = FALSE) %>%
  # 绘图
  ggplot(aes(x = origin_name, y = total_freight)) +
  geom_col() +
  labs(x = "", y = "总发运货运重量", title = "发运总货运重量Top10国家(升序)") +
  theme(axis.text.x = element_text(angle = 90, vjust = 0.5, hjust=1))
补充说明
  • 如果你需要柱子按降序排列,只需要把fct_reorder里的.desc = FALSE改成.desc = TRUE即可。
  • 计算得到的share列是0-1区间的占比值,如果要显示为百分比,可以在mutate里改成share = scales::percent(total_freight / sum(total_freight)),直接生成带百分号的文本。
  • 你最开始写的第一段代码之所以加Top10筛选会取到单条记录最高的10条,是因为你是在原始明细数据层做的筛选,没有先按国家汇总,所以筛选的是明细行而非汇总后的国家维度结果。

内容的提问来源于stack exchange,提问作者David Færgeman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 13:54:25