如何在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
相关产品推荐
相关产品推荐

