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

如何在R中对dataframe按三个变量排序并统计分组计数?

问题原因及解决方法

你出现两个报错的核心原因是跳过了分组统计生成n列的步骤,直接在原始数据表上调用了不存在的n变量。

报错原因解释

  • 第一个Error in -n : invalid argument to unary operator:原始dftime里没有汇总后的n列,R无法识别n对象,对不存在的对象加负号自然触发一元运算符报错。
  • 第二个tapply参数长度不一致报错:去掉负号后,R仍然找不到n列,会尝试调用全局环境中其他同名变量,该变量长度和你的country/case_month列长度不匹配,触发tapply参数校验报错。

完整解决步骤

第一步:先按三个维度分组统计得到n列

library(dplyr)
# 分组计数得到汇总表
dftime_count <- dftime %>%
  group_by(country, case_year, case_month) %>%
  summarise(n = n(), .groups = "drop")

运行后你就可以得到符合要求的、带n列的汇总表。

第二步:对分类变量做排序

注意月份如果按n的总和排序会打乱自然时间顺序,更合理的方式是按1-12月的自然顺序设置因子水平,如果你确实需要按计数排序可以切换注释的代码:

# 定义月份自然顺序的水平值
month_levels <- c("January","February","March","April","May","June",
                  "July","August","September","October","November","December")

dftime_ord <- dftime_count %>%
  # 国家按总基因计数降序排列
  mutate(country = reorder(country, -n, sum),
         # 月份按自然时间顺序排序
         case_month = factor(case_month, levels = month_levels))
         # 若需要按计数总和排序月份,替换为下面的代码
         # case_month = reorder(case_month, -n, sum)

第三步:运行绘图代码

处理完的dftime_ord就可以直接跑你原来的ggplot代码,不会再报错。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:24:02