【问题标题】:PROC FREQ on multiple variables combined into one tablePROC FREQ 将多个变量组合到一个表中
【发布时间】:2017-03-28 14:36:58
【问题描述】:

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

任何帮助将不胜感激。谢谢!

附:我尝试使用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

【问题讨论】:

  • 您是指单个 SAS 数据集,还是单个打印输出表?

标签: sas


【解决方案1】:

我将单独回答这个问题,因为这是在回答问题的其他可能解释;当它澄清时,我会删除一个或另一个。

如果您希望在单个 打印 表中使用它,那么您要么需要使用 proc tabulate,要么需要对数据进行规范化 - 即以 variable | value 的形式放置它。 PROC FREQ 不能在一个表中处理多个单向频率。

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

您可以通过在class 语句、table 语句或proc tabulate 语句中添加missing 选项来覆盖它。所以:

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

这将导致外观与您的表格略有不同,因为它会在您可能想要它们的地方包含缺失的行,并且它们将被考虑到 @ 987654330@ 你可能又不想要它们了。

通常需要进行一些操作;最简单的方法是标准化您的数据,然后针对该标准化数据集运行制表(使用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,或者对您的数据有意义的任何内容,以及您可能拥有的任何标识符/人口统计/whatnot 变量。 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 中构建它。这为您提供了最大的灵活性,但也是最繁重的编程。

【讨论】:

  • 这真的很有帮助。我还没有读完整本书,直到你谈到丢失数据的那部分。我在我的 PROC TABULATE 中添加了 / MISSING 语句,它生成了正确的频率。但奇怪的是,我不知道缺少哪些数据。当我在 MS Access 中过滤 ERstatus = 1 和 InsuranceStatus = 1 时,我返回 204 条记录,这两列没有丢失数据。我必须完成阅读您的帖子或找出 PROC TABULATE 正在查找的缺失信息在哪里,因为它不在 ERstatus 或 InsuranceStatus 列中。
  • 顺便说一下,感谢您的帮助。我被聘为临床研究助理,但我的老板看到我掌握了大量的数学和统计知识以及一些 R 和 SAS 技能,现在我被要求做的就是在 SAS 中运行分析,而我只是没有它的技能水平....还没有。但我正在努力改进,感谢任何帮助。
  • 如果 PRStatus 或 TumorStage 或 Race 中缺少它也会影响 PROC TABULATE 中的 ERStatus 表。
  • 好的,我去看看。谢谢你,乔。希望我公司里有人可以求助,但我想我是目前唯一使用 SAS 的员工,哈!
  • 到目前为止,它也为 Race 返回了所有正确的频率。再次感谢!
【解决方案2】:

您可以使用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查询。

您可能(可能会)仍需要对该数据集进行一些操作以获得最终想要的结构。

【讨论】:

  • 这是来自另一个网站的剪切和粘贴答案。它没有帮助我。
  • @lady8506 Err,这是一个有趣的陈述,但我完全根据自己的知识将其输入到框中 - 肯定没有剪切和粘贴。如果这对您没有帮助,您能否更具体地说明它不符合您的需求?
  • 为了清楚起见,这是唯一的方式,您可以直接从 PROC FREQ 将其放入单个表中,而无需操作原始数据文件(要规范化)或操作输出结果(连接多个数据集)。您获取单个数据集的方式将取决于您希望输出的外观 - 您并没有在您的问题中真正解释这一点。
  • 如果您的意思是单个打印的表格,如果您可以在 OP 中澄清这将是有帮助的。
  • 好的,让我更清楚为什么它对我没有帮助。如果我有 50 个变量需要在其上运行 PROC FREQ,我无法从您的示例中了解是否需要在每个 PROC FREQ 之前使用 ODS OUTPUT 语句,然后使用 ODS OUTPUT CLOSE 继续每个 PROC FREQ;陈述。所以基本上,我是否需要编写 50 次 PROC FREQ 以及 50 次 ODS OUTPUT 语句?其次,当我在两个单独的 PROC FREQ 上使用 ODS OUTPUT,然后提取我输出到的数据集时,输出数据集中只有一个变量,即最后一个被评估的变量。应该有 2 个变量。
猜你喜欢
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多