为了制作一个方差分析相关的课件,去美国CDC网站下载了几个数据集并进行了整合。过程很简单,记录如下:

因为要用到糖化血红蛋白检测结果以及人种、年龄、是否糖尿病患者等数据,所以要下载3个数据集

先进入站点:NHANES Questionnaires, Datasets, and Related Documentation (cdc.gov)

选择一个比较近的年份 NHANES 2017-2018:

NHANES 2017-2018

下载列表中的第1个,人口统计学数据

Demographics Data

说明文件(Doc File,html格式)和数据文件(Data File,SAS的xpt格式)都下载下来备用。

然后下载了实验室检查数据(Laboratory Data)中的糖化血红蛋白(Glycohemoglobin)数据,以及问卷数据(Questionnaire Data)中的糖尿病(Diabetes)问卷数据

由于SAS没有一次性转换或导入多个XPT文件的命令,只好写了一个小程序,执行动态转换:

    /*定义SAS数据集位置;*/
    libname data "F:\TeachingData\Nhanes";

    /*定义XPT文件所在目录*/
    %let dir=F:\TeachingData\Nhanes\xpt\2017-2019;

    /*扫描目录中的xpt文件并保存到xpts数据集中;*/
    filename DIRLIST pipe "dir &dir\*.XPT /b ";
    data xpts ;
    infile DIRLIST lrecl=200 truncover;
    input file_name $100.;
    run;

    /*将所有文件名生成宏变量并执行多次copy;*/
    data _null_;
    set xpts end=end;
    count+1;
    call symputx('xpt'||put(count,4.-l),file_name);
    if end then call symputx('max',count);
    run;
    %macro readxpt(in, out);
    %do i=1 %to &max;
        libname xpt xport "&dir\&xpt&i" access=readonly;
      proc copy inlib=&in outlib=&out;
     run;
    %end;
    %mend readxpt;

    /*这也够麻烦的!;*/
    %readxpt(xpt, data);

剩下的就简单了,直接合并数据集:

    *2017-2020的数据多,就改用这几个数据集了;
    data final;
    merge data.P_Demo data.P_Diq data.P_Ghb;
    by SEQN;
    if missing(LBXGH) then delete;
    run;

最后得到的数据集中,共9737条数据;再剔除糖尿病患者,就得到我想要的数据了。

为什么不用国内的数据?其实我也想用。。。