SAS数据处理基础与实用技巧
引言
在医药行业的数据处理领域,SAS(Statistical Analysis System)是一款强大且应用广泛的工具。对于刚踏入这个行业从事数据工作的新人来说,掌握常用的SAS语句和函数是开启高效工作的关键。接下来,我将分享一些在日常工作中频繁使用的SAS知识,助力大家快速上手。
一、数据读取与导入
1. 读取外部数据文件
在医药行业,我们常常需要处理来自各种数据源的数据,如CSV、Excel文件等。
- 读取CSV文件:
data mydata;
infile 'C:\data\medical_data.csv' delimiter=',' missover firstobs=2;
input id patient_name $ age gender $ diagnosis $;
run;
解释:infile
语句指定了数据文件的路径和分隔符,missever
选项确保在读取数据时遇到不完整的行不会报错,firstobs = 2
表示从第二行开始读取数据(假设第一行为表头)。input
语句定义了数据集中变量的名称和类型,$
表示字符型变量。
- 读取Excel文件:
首先需要使用PROC IMPORT
过程。
proc import datafile='C:\data\medical_excel.xlsx'
out=mydata
dbms=xlsx replace;
sheet='Sheet1';
run;
解释:PROC IMPORT
是专门用于导入外部数据的过程,datafile
指定Excel文件路径,out
指定输出数据集的名称,dbms=xlsx
表示导入的是Excel文件,replace
表示如果存在同名数据集则覆盖,sheet
指定要读取的工作表名称。
2. 从数据库中读取数据
如果数据存储在数据库中,如Oracle、SQL Server等,SAS也提供了相应的连接和读取方法。
- 以连接Oracle数据库为例:
libname oradb oracle user=your_username password=your_password path=your_oracle_sid;
data mydata;
set oradb.your_table_name;
run;
解释:libname
语句创建了一个逻辑库名oradb
,用于连接到Oracle数据库,指定了用户名、密码和数据库实例名(path
)。然后使用set
语句从数据库中的指定表中读取数据并创建新的SAS数据集。
二、数据清洗与预处理
1. 缺失值处理
在医药数据中,缺失值较为常见,需要进行合理处理。
- 检测缺失值:
proc means data=mydata nmiss;
var age diagnosis;
run;
解释:PROC MEANS
过程用于计算数据集的基本统计量,nmiss
选项用于统计每个变量的缺失值数量,var
语句指定要分析的变量。
- 填充缺失值:
可以使用IF - THEN
语句或COALESCE
函数。
data mydata_clean;
set mydata;
if age=. then age = 0; /* 将缺失的年龄值设为0 */
diagnosis = coalesce(diagnosis, 'Unknown'); /* 将缺失的诊断值设为'Unknown' */
run;
解释:IF - THEN
语句直接判断并赋值,COALESCE
函数返回参数列表中的第一个非缺失值,如果所有参数都缺失,则返回缺失值。
2. 重复值处理
data mydata_unique;
set mydata;
by id;
if first.id then output;
run;
解释:通过BY
语句按id
变量进行分组,first.id
是一个系统变量,当遇到每个id
组的第一个观测值时为真,此时使用output
语句输出该观测值,从而实现去除重复的id
记录。
三、数据转换与计算
1. 变量计算
在医药数据处理中,经常需要根据已有变量计算新的变量。
data mydata_calculated;
set mydata;
bmi = weight / (height * height) * 703; /* 计算BMI值 */
run;
解释:根据weight
(体重)和height
(身高)变量计算身体质量指数(BMI),并将结果存储在新变量bmi
中。
2. 数据类型转换
有时候需要将变量的数据类型进行转换,比如将字符型日期转换为数值型日期。
data mydata_date;
set mydata;
new_date = input(date_variable, yymmdd10.); /* 假设date_variable是字符型日期变量 */
format new_date date9.;
run;
解释:input
函数将字符型数据转换为数值型,yymmdd10.
是输入格式,表示日期的格式为年 - 月 - 日,共10位字符。format
语句指定输出格式,date9.
表示以9位字符的日期格式显示。
四、数据查询与筛选
1. 简单条件筛选
data selected_data;
set mydata;
where age > 50 and diagnosis = 'Diabetes';
run;
解释:where
语句用于筛选满足条件的观测值,这里筛选出年龄大于50岁且诊断为糖尿病的患者数据。
2. 复杂条件筛选与逻辑运算
data complex_selected;
set mydata;
where (age between 30 and 60) and (gender = 'Male' or diagnosis in ('Hypertension', 'Heart Disease'));
run;
解释:使用between
表示范围,or
和and
进行逻辑运算,in
用于指定多个可能的值。筛选出年龄在30到60岁之间,且性别为男性或者诊断为高血压或心脏病的患者数据。
五、常用函数
1. 统计函数
- 计算均值、标准差等:
proc means data=mydata mean std median;
var age weight;
run;
解释:PROC MEANS
过程可以计算多个统计量,如均值(mean
)、标准差(std
)、中位数(median
),var
语句指定要计算统计量的变量。
2. 字符函数
- 字符串截取:
data mydata_substring;
set mydata;
short_name = substr(patient_name, 1, 10); /* 截取患者姓名的前10个字符 */
run;
解释:substr
函数用于截取字符串,第一个参数是要截取的字符串变量,第二个参数是起始位置,第三个参数是截取的长度。
- 字符串查找与替换:
data mydata_replace;
set mydata;
new_diagnosis = tranwrd(diagnosis, 'Diabetes', 'Diabetes Mellitus'); /* 将Diabetes替换为Diabetes Mellitus */
run;
解释:tranwrd
函数用于查找并替换字符串中的指定内容,第一个参数是要操作的字符串变量,第二个参数是要查找的字符串,第三个参数是替换后的字符串。
3. 日期函数
- 计算日期差值:
data mydata_datediff;
set mydata;
days_diff = intck('day', admission_date, discharge_date); /* 计算入院日期和出院日期之间的天数差 */
run;
解释:intck
函数用于计算两个日期之间的间隔,第一个参数指定间隔的单位(这里是’ day’表示天),第二个参数是起始日期,第三个参数是结束日期。
六、数据输出与报告
1. 数据输出到外部文件
- 输出为CSV文件:
proc export data=mydata
outfile='C:\output\processed_data.csv'
dbms=csv replace;
run;
解释:PROC EXPORT
过程用于将SAS数据集输出到外部文件,data
指定要输出的数据集,outfile
指定输出文件路径,dbms=csv
表示输出为CSV文件,replace
表示如果文件已存在则覆盖。
2. 生成报表
proc report data=mydata;
columns id patient_name age diagnosis;
define id / display;
define patient_name / display;
define age / display;
define diagnosis / display;
run;
解释:PROC REPORT
过程用于生成报表,columns
语句指定报表中要显示的变量,define
语句定义每个变量在报表中的显示属性。
七、总结
以上就是SAS数据工作者在医药行业数据处理工作初期常用的一些SAS语句和函数。当然,SAS的功能远不止于此,随着工作的深入和数据处理需求的增加,大家还会接触到更多高级的功能和技巧。希望这些基础内容能帮助新人们快速入门,在医药数据处理的道路上迈出坚实的第一步。在实际工作中,要多实践、多思考,不断积累经验,逐步提升自己的数据处理能力。