3  医学数据基础操作

3.1 数据结构与类型

3.1.1 向量(临床指标存储)

向量是R中最基本的数据结构,适合存储临床指标:

代码
# 创建数值型向量存储血压数据
sbp <- c(120, 135, 142, 128, 115)
dbp <- c(80, 85, 90, 82, 75)

# 创建字符型向量存储诊断结果
diagnosis <- c("高血压", "糖尿病", "冠心病", "高血压", "正常")

# 创建逻辑型向量标记是否需要治疗
needs_treatment <- c(TRUE, TRUE, TRUE, FALSE, FALSE)

# 向量的基本运算
mean(sbp)  # 平均收缩压
[1] 128
代码
sd(dbp)    # 舒张压标准差
[1] 5.59464
代码
table(diagnosis)  # 诊断结果频数统计
diagnosis
高血压 冠心病 糖尿病   正常 
     2      1      1      1 

3.1.2 数据框(患者信息表构建)

数据框是最常用的数据结构,适合存储患者信息表:

代码
# 创建患者信息数据框
patients <- data.frame(
  ID = 1:5,
  姓名 = c("张三", "李四", "王五", "赵六", "钱七"),
  年龄 = c(45, 52, 38, 61, 42),
  性别 = factor(c("男", "女", "男", "女", "男")),
  收缩压 = sbp,
  舒张压 = dbp,
  诊断 = diagnosis,
  stringsAsFactors = FALSE
)

# 查看数据结构
str(patients)
'data.frame':   5 obs. of  7 variables:
 $ ID    : int  1 2 3 4 5
 $ 姓名  : chr  "张三" "李四" "王五" "赵六" ...
 $ 年龄  : num  45 52 38 61 42
 $ 性别  : Factor w/ 2 levels "男","女": 1 2 1 2 1
 $ 收缩压: num  120 135 142 128 115
 $ 舒张压: num  80 85 90 82 75
 $ 诊断  : chr  "高血压" "糖尿病" "冠心病" "高血压" ...
代码
summary(patients)
       ID        姓名                年龄      性别       收缩压   
 Min.   :1   Length:5           Min.   :38.0   男:3   Min.   :115  
 1st Qu.:2   Class :character   1st Qu.:42.0   女:2   1st Qu.:120  
 Median :3   Mode  :character   Median :45.0          Median :128  
 Mean   :3                      Mean   :47.6          Mean   :128  
 3rd Qu.:4                      3rd Qu.:52.0          3rd Qu.:135  
 Max.   :5                      Max.   :61.0          Max.   :142  
     舒张压         诊断          
 Min.   :75.0   Length:5          
 1st Qu.:80.0   Class :character  
 Median :82.0   Mode  :character  
 Mean   :82.4                     
 3rd Qu.:85.0                     
 Max.   :90.0                     

3.2 数据导入与导出

3.2.1 读取Excel/CSV病历数据

代码
# 读取CSV文件
library(readr)
data_csv <- read_csv("patient_data.csv")

# 读取Excel文件
library(readxl)
data_excel <- read_excel("clinical_records.xlsx", 
                        sheet = "Sheet1")

# 读取SPSS文件
library(haven)
data_spss <- read_sav("hospital_data.sav")

3.2.2 导出统计分析结果

代码
# 导出为CSV
write_csv(patients, "processed_data.csv")

# 导出为Excel
library(writexl)
write_xlsx(patients, "analysis_results.xlsx")

# 导出为SPSS格式
write_sav(patients, "final_data.sav")

3.3 医学数据清洗实战

3.3.1 处理缺失值(实验室数据)

代码
# 创建带有缺失值的实验室数据
lab_data <- data.frame(
  ID = 1:6,
  血红蛋白 = c(13.5, NA, 12.8, 14.2, NA, 11.9),
  白细胞 = c(6.5, 7.2, NA, 5.8, 8.1, NA),
  血小板 = c(NA, 235, 180, NA, 205, 195)
)

# 检查缺失值
colSums(is.na(lab_data))
      ID 血红蛋白   白细胞   血小板 
       0        2        2        2 
代码
# 处理缺失值
library(tidyverse)
lab_data_clean <- lab_data %>%
  mutate(across(where(is.numeric) & !ID, 
                ~ifelse(is.na(.), mean(., na.rm = TRUE), .)))

# 展示处理结果
print("处理前:")
[1] "处理前:"
代码
print(lab_data)
  ID 血红蛋白 白细胞 血小板
1  1     13.5    6.5     NA
2  2       NA    7.2    235
3  3     12.8     NA    180
4  4     14.2    5.8     NA
5  5       NA    8.1    205
6  6     11.9     NA    195
代码
print("处理后:")
[1] "处理后:"
代码
print(lab_data_clean)
  ID 血红蛋白 白细胞 血小板
1  1     13.5    6.5 203.75
2  2     13.1    7.2 235.00
3  3     12.8    6.9 180.00
4  4     14.2    5.8 203.75
5  5     13.1    8.1 205.00
6  6     11.9    6.9 195.00

3.3.2 异常值检测(生命体征数据)

代码
# 创建生命体征数据
vitals <- data.frame(
  ID = 1:100,
  体温 = rnorm(100, 36.8, 0.5),
  心率 = rnorm(100, 75, 10),
  呼吸 = rnorm(100, 16, 2)
)

# 箱线图检测异常值
library(ggplot2)
ggplot(vitals, aes(y = 心率)) +
  geom_boxplot() +
  labs(title = "心率异常值检测") +
  theme_minimal()

代码
# 使用IQR方法识别异常值
identify_outliers <- function(x) {
  q1 <- quantile(x, 0.25)
  q3 <- quantile(x, 0.75)
  iqr <- q3 - q1
  lower_bound <- q1 - 1.5 * iqr
  upper_bound <- q3 + 1.5 * iqr
  x < lower_bound | x > upper_bound
}

# 标记异常值
vitals$心率_异常 <- identify_outliers(vitals$心率)
练习
  1. 尝试导入一个真实的医学数据集
  2. 对数据进行基本的清洗和预处理
  3. 处理数据中的缺失值和异常值
  4. 将处理后的数据导出为不同格式

3.4 本章小结

在本章中,我们学习了:

  1. R语言中的基本数据结构
  2. 如何导入和导出医学数据
  3. 处理缺失值的方法
  4. 异常值的检测和处理

下一章,我们将学习如何使用ggplot2进行医学数据可视化。