首页 文章

多个变量的PROC FREQ组合成一个表

提问于
浏览
0

我有以下问题 . 我需要在多个变量上运行PROC FREQ,但我希望输出都在同一个表上 . 目前,PROC FREQ声明类似于TABLES ERstatus Age Race,InsuranceStatus;将计算每个变量的频率,并将它们全部打印在不同的表格上 . 我只想要一张 table 上的数据 .

任何帮助,将不胜感激 . 谢谢!

附:我尝试使用PROC TABULATE,但它没有正确计算N,所以我不确定我做错了什么 . 这是我的PROC TABULATE代码 . 我的变量都是绝对的,所以我只需知道N和百分比 .

PROC TABULATE DATA = BCanalysis;
CLASS ERstatus PRstatus Race TumorStage InsuranceStatus;
TABLE (ERstatus PRstatus Race TumorStage) * (N COLPCTN), InsuranceStatus;
RUN;

上述代码不会返回基于InsuranceStatus的正确频率,其中0 =保险,1 =未保险,但PROC FREQ确实如此 . 也无法使用ROWPCTN正确计算 . 因此,我可以通过任何方式获得PROC FREQ来计算一个表上的多个变量,或者PROC TABULATE来返回正确的频率 .

这是一个很好的输出图像,仅对ERstatus和InsuranceStatus进行了简化分析 . 您可以看到PROC FREQ返回204个人,其ERstatus为1,InsuranceStatus为1.这是正确的 . PROC TABULATE中的值不是 . OUTPUT

2 回答

  • 0

    我澄清了我会删除其中一个 .

    如果你想在一个打印的表中使用它,那么你需要使用 proc tabulate 或者你需要规范化你的数据 - 意思是把它放在 variable | value 的形式 . PROC FREQ 无法在单个表中执行多个单向频率 .

    对于 PROC TABULATE ,您的问题可能是缺少数据 . 将检查 class 语句上的任何变量是否缺失,如果任何行缺少任何类变量的数据,那么这些行将完全从所有变量的列表中排除 .

    您可以通过在 class 语句或表语句或 proc tabulate 语句中添加 missing 选项来覆盖此选项 . 所以:

    PROC TABULATE DATA = BCanalysis;
    CLASS ERstatus PRstatus Race TumorStage InsuranceStatus/missing;
    TABLE (ERstatus PRstatus Race TumorStage) * (N COLPCTN), InsuranceStatus;
    RUN;
    

    这会导致外观与你的 table 略有不同,因为它会包含你可能不想要它们的地方缺少的行,并且当你再次可能不想要它们时,它们将被分解为 colpctn .

    通常需要一些操作;最简单的方法是规范化您的数据,然后针对该规范化数据集运行制表(使用 PROC TABULATEPROC FREQ ,以较合适者为准; TABULATE 具有更好的百分比选项) .

    假设我们有这个:

    data class;
      set sashelp.class; 
      if _n_=5 then call missing(age);
      if _n_=3 then call missing(sex);
    run;
    

    我们希望将这两个表放在一个表中 .

    proc freq data=class;
      tables age sex;
    run;
    

    如果我们这样做:

    proc tabulate data=class;
      class age sex;
      tables (age sex),(N colpctn);
    run;
    

    然后我们得到两个子表的总共N = 17 - 这不是我们想要的,我们想要N = 18 . 然后我们可以这样做:

    proc tabulate data=class;
      class age sex/missing;
      tables (age sex),(N colpctn);
    run;
    

    但那也不是正确的;我希望F有8/18 = 44.44%和M 10/18 = 55.55%,而不是42%和53%,5%分配给缺失的行 .

    我这样做的方法是规范化数据 . 这意味着您将获得包含2个变量 varnameval 的数据集,或者您的数据有意义的数据集,以及您可能拥有的任何标识符/人口统计/什么变量 . val 必须是字符,除非您的所有值都是数字 .

    因此,例如,我使用 agesex 变量将 class 规范化 . 我没有保留任何标识符,但你肯定可以在你的数据中,我想 InsuranceStatus 会保留在那里,如果我理解你在那张表中做了什么 . 一旦我有了规范化的表,我只使用这两个变量,并在 proc tabulate 中仔细构造一个分母定义,以便为我的 pctn 值提供正确的基础 . 它与之前的单个表不完全相同 - 变量名称在它自己的列中,而不是在值列表的顶部 - 但老实说,在我看来这看起来更好 .

    data class_norm;
      set class;
      length val $2;
      varname='age';
      val=put(age,2. -l);
      if not missing(age) then output;
      varname='sex';
      val=sex;
      if not missing(sex) then output;
      keep varname val;
    run;
    
    
    proc tabulate data=class_norm;
      class varname val;
      tables varname=' '*val=' ',n pctn<val>;
    run;
    

    如果你想要比这更好的东西,你可能需要在 proc report 中构建它 . 这为您提供了最大的灵活性,但也是最繁重的程序 .

  • 0

    您可以使用 ODS OUTPUT 将所有PROC FREQ输出到一个数据集 .

    ods output onewayfreqs=class_freqs;
    proc freq data=sashelp.class;
      tables age sex;
    run;
    ods output close;
    

    要么

    ods output crosstabfreqs=class_tabs;
    proc freq data=sashelp.class;
      tables sex*(height weight);
    run;
    ods output close;
    

    Crosstabfreqs 是交叉表输出的名称,而单向频率是 onewayfreqs . 如果您忘记了名称,可以使用 ods trace 查找名称 .

    您可能(可能会)仍然需要操纵此数据集以获得您最终想要的结构 .

相关问题