R使用group_by分组统计后如何补全缺失分组的0计数用于折线图绘制
问题描述
以下是我的原始数据:
Date Injury.Cause n 1 2019-04-14 Road traffic 1 2 2019-04-15 Accidental injuries 1 3 2019-04-18 Road traffic 1 4 2019-04-23 Burns 1 5 2019-04-26 Road traffic 1 6 2019-05-01 Road traffic 1 7 2019-05-02 Road traffic 1 8 2019-05-08 Burns 1 9 2019-05-08 Road traffic 1 10 2019-05-09 Falls 1 11 2019-05-09 Road traffic 1 12 2019-05-14 Burns 1 13 2019-05-16 Falls 1 14 2019-05-20 Falls 1 15 2019-05-22 Road traffic 1
需要将这些数据绘制成折线图,因此执行了如下代码做分组统计:
Pivot.start.with_25 <- keep_long_format %>% group_by(Date, Injury.Cause ) %>% summarise(Date.sum = sum(n))
得到的统计结果如下:
Date Injury.Cause Date.sum <chr> <chr> <int> 1 2019-03-25 Accidental injuries 1 2 2019-03-25 Burns 5 3 2019-03-25 Falls 4 4 2019-03-25 Road traffic 12 5 2019-06-25 Burns 5 6 2019-06-25 Falls 8 7 2019-06-25 Road traffic 17 8 2019-09-25 Accidental injuries 2 9 2019-09-25 Burns 8 10 2019-09-25 Falls 6
希望所有受伤原因分类都能在首个日期的统计结果中出现,即便对应病例数为0也能在折线图中显示为0值。如何将这些缺失分类的统计值补为0以满足绘图需求?
解决方案
你可以直接使用tidyverse生态中tidyr包的complete函数实现缺失组合补全,操作非常简便:
方案1:所有日期均补全全部受伤分类(推荐,适合折线图无断点需求)
该方案会为所有统计日期补全全量受伤原因分类,缺失值统一填充为0,所有分类的折线都会从首个日期完整绘制:
library(dplyr) library(tidyr) Pivot.start.with_25 <- keep_long_format %>% group_by(Date, Injury.Cause) %>% summarise(Date.sum = sum(n), .groups = "drop") %>% # 生成日期和受伤原因的全量组合,缺失的计数填充为0 complete(Date, Injury.Cause, fill = list(Date.sum = 0))
方案2:仅补全首个日期的缺失分类
如果你只需要首个日期包含全部分类,其他日期保留原有统计逻辑,可以用以下代码:
library(dplyr) # 提取全量受伤原因与首个日期 all_causes <- unique(keep_long_format$Injury.Cause) first_date <- min(keep_long_format$Date) Pivot.start.with_25 <- keep_long_format %>% group_by(Date, Injury.Cause) %>% summarise(Date.sum = sum(n), .groups = "drop") %>% # 给首个日期拼接缺失的分类,赋值为0 bind_rows( tibble( Date = first_date, Injury.Cause = setdiff(all_causes, .$Injury.Cause[.$Date == first_date]), Date.sum = 0 ) ) %>% arrange(Date, Injury.Cause)
处理完成后的数据直接传入ggplot绘图即可,不会出现因为初始值缺失导致的折线截断问题。
内容的提问来源于stack exchange,提问作者Ram6
相关产品推荐
相关产品推荐

