← 返回GBD分析主页

Table1 生成

从 GBD 原始数据生成论文标准表格1:包含患病人数、发病率、年龄标化率及95%置信区间

功能说明

输入:GBD 原始导出数据(CSV格式),包含 location, year, age_name, sex_name, metric_name, measure_name, val, lower, upper 等列

输出:整理后的 Table1 格式数据,包含:

  • 全年龄段疾病人数(Number)及95%UI
  • 年龄标化率(Rate)及95%UI
  • 各年龄段分组数据

适用场景:论文 Table1、流行病学特征描述、疾病负担报告

代码实现

1. 数据读取与预处理

R 代码:读取 GBD 数据
# 读取 GBD 原始数据
library(data.table)
library(dplyr) # 读取数据(示例路径)
df <- fread("examples/gbd_input.csv") # 查看数据结构
str(df) # 查看关键字段分布
table(df$measure_name) # 测量指标:患病/发病
table(df$metric_name) # 数据类型:Number/Rate
table(df$age_name) # 年龄分组

2. 提取全年龄段疾病人数

R 代码:提取人数数据
# 筛选条件:
# 1. 全年龄段 (All ages)
# 2. 指定年份(如2021)
# 3. 数据类型为人数 (Number) df_number <- subset(df, age_name == 'All ages' & # 全年龄段 year == 2021 & # 指定年份 metric_name == 'Number' # 人数数据
) # 数值取整
df_number$val <- round(df_number$val, 0) df_number$lower <- round(df_number$lower, 0)
df_number$upper <- round(df_number$upper, 0) # 格式化 UI 字符串:val (lower, upper)
df_number$UI <- paste0('(', df_number$lower, ', ', df_number$upper, ')')
df_number$UI <- paste(df_number$val, df_number$UI, sep = ' ') # 保存结果
fwrite(df_number, "examples/output_table1_number.csv")

3. 提取年龄标化率

R 代码:提取年龄标化率
# 筛选条件:
# 1. 年龄标化 (Age-standardized)
# 2. 指定年份
# 3. 数据类型为率 (Rate) df_rate <- subset(df, age_name == 'Age-standardized' & # 年龄标化 year == 2021 & # 指定年份 metric_name == 'Rate' # 率值数据
) # 率值保留2位小数
df_rate$val <- round(df_rate$val, 2) df_rate$lower <- round(df_rate$lower, 2)
df_rate$upper <- round(df_rate$upper, 2) # 格式化 UI 字符串
df_rate$UI <- paste0('(', df_rate$lower, ', ', df_rate$upper, ')')
df_rate$UI <- paste(df_rate$val, df_rate$UI, sep = ' ') # 保存结果
fwrite(df_rate, "examples/output_table1_rate.csv")

4. 完整流程函数

R 代码:完整 Table1 生成函数
# Table1 生成完整函数
generate_table1 <- function(input_file, output_dir = "examples/", year = 2021) { library(data.table) library(dplyr) # 读取数据 df <- fread(input_file) # 1. 人数数据(全年龄段) df_number <- subset(df, age_name == 'All ages' & year == year & metric_name == 'Number' ) df_number$val <- round(df_number$val, 0) df_number$lower <- round(df_number$lower, 0) df_number$upper <- round(df_number$upper, 0) df_number$UI <- paste(df_number$val, paste0('(', df_number$lower, ', ', df_number$upper, ')')) # 2. 年龄标化率 df_rate <- subset(df, age_name == 'Age-standardized' & year == year & metric_name == 'Rate' ) df_rate$val <- round(df_rate$val, 2) df_rate$lower <- round(df_rate$lower, 2) df_rate$upper <- round(df_rate$upper, 2) df_rate$UI <- paste(df_rate$val, paste0('(', df_rate$lower, ', ', df_rate$upper, ')')) # 保存 fwrite(df_number, paste0(output_dir, "table1_number.csv")) fwrite(df_rate, paste0(output_dir, "table1_rate.csv")) return(list(number = df_number, rate = df_rate))
} # 使用示例
result <- generate_table1("examples/gbd_input.csv", year = 2021)

常见问题

Q1: 数据中没有 "All ages" 怎么办?

→ 使用 unique(df$age_name) 查看所有年龄分组,可能需要手动汇总各年龄段。

Q2: 置信区间显示为 NA?

→ 检查原始数据中 lower/upper 是否有缺失值,GBD 部分数据不提供置信区间。

Q3: 如何按地区分组?

→ 在 subset 条件中添加 location_name == 'China' 或使用 group_by(location_name) 分组处理。

相关模块