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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:39:01