临床研究数据导入 SPSS/R:
列名设计从采集阶段就要做对
从 HIS 截图提取完数据、拿到 Excel 文件,感觉工作已经完成了一大半。但打开 SPSS,点"导入数据",第一步就卡住——"血红蛋白(g/L)"这个列名被自动改成了"血红蛋白_g_L_",括号和斜杠被替换掉;或者在 R 里 read.csv() 之后,所有中文列名变成了乱码。
这类问题不复杂,但如果等到导入阶段才处理,几十个列名逐一修改再补标签,半小时到两小时就没了。这篇文章解释为什么会出现这些问题,以及如何从数据采集阶段就把列名设计得对统计软件友好。
SPSS 和 R 的变量名限制:具体是哪些字符会出问题
SPSS 和 R 对列名都有约束,但方式不同:
| 软件 | 约束规则 | 临床列名里的常见问题字符 |
|---|---|---|
| SPSS | 变量名最长 64 字符,不允许括号、斜杠、空格,不能以数字开头 | 血红蛋白(g/L) 里的 ( ) / |
| SPSS | 中文变量名技术上支持,但旧版本或非 Unicode 环境下导入可能乱码 | SPSS 22 及以下版本,Windows GBK 系统 |
| R | 变量名含空格或特殊符号需用反引号包裹,否则代码报错 | WBC(×10⁹/L) 里的 ×、⁹、/ |
| R | 中文在 RStudio 里通常正常,但命令行 R 或非 UTF-8 系统上可能乱码 | Windows 命令行执行脚本,服务器环境 |
最集中的问题字符:括号 ( )、斜杠 /、乘号 ×、上标 ⁹、希腊字母 μ。这些恰好是临床检验列名里最自然的写法——"血肌酐(μmol/L)"、"WBC(×10⁹/L)"——对人类读者清晰,对统计软件有麻烦。
宽格式还是长格式:大多数临床研究用宽格式
在整理列名之前,先确认数据的整体结构是否符合分析需要。临床研究数据有两种常见格式:
宽格式(Wide format):每行一个患者,每个变量占一列。100 例患者就是 100 行。多时间点随访时,同一指标的不同时间点各占一列,例如 Hb_BL、Hb_M3、Hb_M6。适合:描述性统计、t 检验、回归分析、相关分析、生存分析。SPSS 处理宽格式最自然。
长格式(Long format):每行一个观测记录,同一患者不同时间点的数据分布在多行。适合:混合线性模型、重复测量 ANOVA、R 里的 ggplot2 分面绘图。R 的 tidyverse 生态对长格式更友好。
对大多数临床研究生来说:宽格式是默认选择。从 HIS 截图按患者和访视时间点分批提取后合并,导出结果就是宽格式,直接适配 SPSS,不需要额外转换。如果后续需要长格式做混合模型,R 里用 tidyr::pivot_longer() 从宽格式转换,比直接收集长格式数据更灵活。
两套命名:收集用显示名,分析用变量名
解决"给人看 vs 给软件识别"矛盾的标准做法是分开两套命名:
- 显示名(数据收集阶段):带单位、带中文,语义清晰。例:
血红蛋白(g/L)、血肌酐(μmol/L)。这是你在简录AI里定义的列名,也是 Excel 里的列头,给自己和协作同学看。 - 变量名(统计分析阶段):短、纯英文或国际缩写、无特殊字符。例:
Hb、Cr、WBC。在 SPSS 里这填入变量名(Variable Name)字段,显示名放入变量标签(Variable Label)字段。
| 显示名(收集用) | 变量名(分析用) | 说明 |
|---|---|---|
| 血红蛋白(g/L) | Hb |
国际通用缩写 |
| 白细胞计数(×10⁹/L) | WBC |
国际通用缩写 |
| 血清肌酐(μmol/L) | Cr |
单位在变量标签里记录 |
| 基线血红蛋白(g/L) | Hb_BL |
BL = Baseline,加时间点后缀 |
| 3个月血红蛋白(g/L) | Hb_M3 |
M3 = Month 3,宽格式随访数据命名模式 |
在 SPSS 里:Variable Name 填 Hb,Variable Label 填 血红蛋白(g/L),Measure 选 Scale。输出表格里显示完整中文标签,语法代码里用干净的变量名,两者不冲突。
在 R 里,用 readxl::read_excel() 读入 .xlsx 文件,中文列名通常正常。如果之后需要在代码里引用,可以手动重命名:
library(readxl)
df <- read_excel("data.xlsx")
names(df)[names(df) == "血红蛋白(g/L)"] <- "Hb"
names(df)[names(df) == "血清肌酐(μmol/L)"] <- "Cr"
或者用 janitor::clean_names() 自动转换所有列名为下划线分隔的英文(效果不如手动命名直观,但快)。
导入前的检查清单
检查列名里是否含软件不允许的字符
重点检查:括号 ( )、斜杠 /、乘号 ×、上标数字、希腊字母 μ、空格。在 Excel 里用 Ctrl+H 批量替换,或者在 SPSS 导入向导里逐条确认自动修改是否合理。修改后同步更新变量标签字段,确保原始含义没有丢失。
确认缺失值是空白单元格,不是 0 或占位符
SPSS 默认将空白单元格识别为 System Missing(.),这是正确行为。如果缺失值被填成了 0,SPSS 会把它当数值参与计算,均值和标准差都会偏。导入前在 Excel 里确认缺失值是真正的空白,清除所有"N/A"、"—"、"-"等占位符。
分类变量确认是数字编码还是文字
SPSS 处理分类变量(性别、分组、是否手术)时,数字编码(0/1)比中文文字(男/女)更稳定。如果收集时用了文字,导入后在 SPSS 里设置值标签(Value Labels)对应含义;或者在 Excel 里先做一次文字→数字的替换再导入,避免变量类型被识别为 String。
每行一例患者,有唯一患者 ID 列
宽格式数据必须有一列唯一标识符——住院号、病历号或匿名化后的研究编号。这列在 SPSS 里设为 String 类型,不参与统计计算,但在数据核查和与其他数据表合并时不可缺少。
多表合并按患者 ID 对齐,不要用行序号
如果分别提取了血常规和生化全套,合并时用 Excel 的 VLOOKUP 或 R 的 merge(df1, df2, by="PatientID") 按患者 ID 连接,不要直接横向粘贴两个表。两个独立提取批次里的行顺序几乎不可能完全对齐。
常见问题
简录AI 导出的 Excel 可以直接导入 SPSS 吗?
大多数情况下可以,SPSS 支持直接打开 .xlsx 文件。如果列名里有括号、斜杠等字符,导入向导会提示变量名非法并自动修改(通常用下划线替换)。建议导入完成后立即检查变量名是否被改动,有改动则在变量标签字段补全原始含义。
R 里读 Excel 中文乱码怎么处理?
首先确认文件存为 .xlsx 而不是旧版 .xls。用 readxl::read_excel() 读取 .xlsx,这个包对 UTF-8 中文支持最稳定。如果用 read.csv() 读 CSV 出乱码,加参数 fileEncoding = "UTF-8";Windows 系统保存的中文 CSV 有时是 GBK 编码,改 fileEncoding = "GBK"。
多个随访时间点的数据,放一个表还是分开?
放在一个宽格式表里,一行一例患者,不同时间点的同一指标用后缀区分(Hb_BL、Hb_M3、Hb_M6)。分开存会在合并时引入对齐风险。SPSS 的配对 t 检验、重复测量 ANOVA 都需要宽格式,R 里随时可以用 pivot_longer() 转换为长格式,灵活性更好。
方法部分怎么描述数据导入和格式处理?
可以写:"提取结果以宽格式 Excel 文件导出,每例患者占一行,各检验指标按预定义字段分列,缺失检验项目保留为空值(系统缺失)。导入 SPSS [版本号] 前对变量名合规性及缺失值格式进行核查,变量标签字段记录各变量的完整中文名称及单位。"
有必要单独写一份变量说明文档吗?
超过 20 个变量的研究建议维护一份变量字典:每行记录一个变量的显示名、变量名、单位、数据类型(连续/分类)、分类变量编码规则,以及数据来源。用 Excel 的一个 Sheet 就够。这份文档在审稿、数据复核、以及其他人接手你的数据时都会用到。