在R中基于入院日期计算不同时段生存状态并生成统计表格
R语言处理死亡时间分类变量及统计表格实现
1. 数据预处理:转换日期格式
原始数据中的日期为字符型,需先转为R可识别的Date类型,这里使用lubridate包的dmy()函数适配日-月-年格式:
# 安装并加载lubridate包(首次使用需安装) install.packages("lubridate") library(lubridate) # 生成示例数据并转换日期 set.seed(1) tep <- data.frame( Date_of_birth = sample(c("11-12-1987", "11-10-1999", "19-01-1977", "20-12-1950"), 20, TRUE), Hospital_admission = sample(c("11-02-2019", "11-03-2019", "10-02-2019", "11-03-2019", "10-03-2019"), 20, TRUE), Death_date = sample(c("10-03-2019", "10-06-2019", "12-01-2020", "05-03-2019", "01-02-2020"), 20, TRUE) ) # 转换日期列 tep$Date_of_birth <- dmy(tep$Date_of_birth) tep$Hospital_admission <- dmy(tep$Hospital_admission) tep$Death_date <- dmy(tep$Death_date)
2. 创建死亡时间分类变量
计算入院到死亡的时间差,生成三个二分类变量(1=符合条件,0=不符合),同时处理死亡日期早于入院日期的异常数据:
# 计算入院至死亡的天数差 tep$days_since_admission <- as.numeric(difftime(tep$Death_date, tep$Hospital_admission, units = "days")) # 30天内死亡标记 tep$death_30d <- ifelse(tep$days_since_admission >= 0 & tep$days_since_admission <= 30, 1, 0) # 6个月内死亡标记(用%m+%计算准确的6个月后日期) tep$death_6m <- ifelse(tep$Death_date >= tep$Hospital_admission & tep$Death_date <= tep$Hospital_admission %m+% months(6), 1, 0) # 1年内死亡标记 tep$death_1y <- ifelse(tep$Death_date >= tep$Hospital_admission & tep$Death_date <= tep$Hospital_admission %m+% years(1), 1, 0)
3. 模拟gender变量(原始数据无此字段)
按需求生成性别分组变量:
set.seed(1) tep$gender <- sample(c("Male", "Female"), 20, replace = TRUE)
4. 生成总体百分比统计表格
基础R实现
# 计算频数与百分比 death_summary <- rbind( "30天内死亡" = c(Count = sum(tep$death_30d), Percentage = round(mean(tep$death_30d)*100, 1)), "6个月内死亡" = c(Count = sum(tep$death_6m), Percentage = round(mean(tep$death_6m)*100, 1)), "1年内死亡" = c(Count = sum(tep$death_1y), Percentage = round(mean(tep$death_1y)*100, 1)) ) print(death_summary)
美观表格实现(dplyr+gt)
install.packages(c("dplyr", "gt")) library(dplyr) library(gt) tep %>% summarise( `30天内死亡(%)` = round(mean(death_30d)*100, 1), `6个月内死亡(%)` = round(mean(death_6m)*100, 1), `1年内死亡(%)` = round(mean(death_1y)*100, 1) ) %>% gt() %>% tab_header(title = "死亡时间分类变量总体统计")
5. 按gender分组的统计表格
基础R实现
gender_death_summary <- tep %>% group_by(gender) %>% summarise( `30天内死亡(%)` = round(mean(death_30d)*100, 1), `6个月内死亡(%)` = round(mean(death_6m)*100, 1), `1年内死亡(%)` = round(mean(death_1y)*100, 1) ) print(gender_death_summary)
美观表格实现(gt)
gender_death_summary %>% gt() %>% tab_header(title = "按性别分组的死亡时间统计") %>% cols_label(gender = "性别")
关键注意点
- 日期格式适配:若原始日期格式为年-月-日或月-日-年,需替换为
ymd()或mdy()函数 - 异常值处理:死亡日期早于入院日期的样本逻辑不合理,统一标记为0
- 时间精度:使用
%m+%计算月/年增量,比固定天数更精准(自动处理不同月份天数差异)
内容的提问来源于stack exchange,提问作者user19807620
相关产品推荐
相关产品推荐

