【问题标题】:Need to compare 2 variables, each coming from a separate data set, and flag differences需要比较 2 个变量,每个变量来自一个单独的数据集,并标记差异
【发布时间】:2013-07-12 14:10:50
【问题描述】:

我有 2 个 SAS 数据集,LabRslt。它们都具有所有相同的变量,但Rslt 应该具有本质上是Lab 的子集。对于我正在尝试做的事情,有 4 个重要变量:visitaccsnnumbattrnamlbtestcd。都是字符变量。我想比较两个文件 Lab 和 Rslt 以找出它们的不同之处 - 具体来说,我需要知道每个唯一 accsnnumlbtestcd 计数。

但我必须控制几个因素。首先,我只需要比较battrnam 变量中具有“Lipid Panel”或“Chemistry (6)”的观察结果。 Rslt 文件只包含这些观察结果,所以我们不需要担心那个。所以我使用此代码对Lab 进行了子集化:

data work.lab;
  set  livingston.ndb_lab_1;
  where battrnam contains "Lipid Panel" or battrnam = "Chemisty (6)";
run; 

这很好用。现在,我需要控制变量访问。我需要删除 Lab 和 Rslt 中包含“第 1 天”或“筛选”的访问的所有观察结果。我使用以下代码完成了此操作:

data work.lab;
set work.lab;
if visit = "Day 1" or visit = "Screening" then delete;
else visit = visit;
run;

data work.rslt;
set work.rslt;
if visit = "Day 1" or visit = "Screening" then delete;
else visit = visit;
run; 

现在这就是我卡住的地方。 我需要创建一种方法来比较两个单独文件 Lab 和 Rslt 之间的 accsnnum 的 lbtestcd 计数,并且我需要一种方法来标记在 Lab 和 Rslt 之间存在差异的 accsnum 计数lbtestcd。例如,如果 Lab 的 accsnum A1 具有 5 个唯一 lbtestcd 值,而 Rslt 具有 accsnum A1 具有 7 个唯一 lbtestcd 值,我需要引起我的注意。

我可以为每个文件做一个 proc freq,但这些都是大型数据集,我不想手动比较。也许通过 accsnum 将 lbtestcd 的计数导出到 2 个文件 Lab 和 Rslt 中的每一个的新第三个数据集中的变量,然后创建一个变量是这两个文件的差异?这样如果差异!= 0 那么我可以获得这些 asscnum 的报告吗? SQL 中的建议也可以,因为我可以通过 SAS 运行它。

编辑 我已经使用了一些 SQL 来使用下面的代码通过 accsnum 获取每个数据集的 lbtestcd 计数,但我仍然需要弄清楚如何将这些值导出到数据集以进行比较。

proc sql;
select accsnnum, count(lbtestcd)
from work.lab1
group by accsnnum;
quit;

proc sql;
select accsnnum, count(lbtestcd)
from work.rslt1
group by accsnnum;
quit;

感谢您提供的所有帮助。这个真的难倒我!

【问题讨论】:

  • 您在第一个数据步骤中做了什么?这不是合法的 SAS 代码 - 您可以将其更改为您实际使用的代码,或者如果它不是 Livingston 图书馆中的 SAS,请告诉我们您使用的是什么 DBMS?
  • 很抱歉——不小心剪错了代码。现在已经更正了。
  • 在 SQL 中,您可以使用 CREATE TABLE 来制作包含查询结果的数据集。

标签: sql substring sas subset


【解决方案1】:

我会在每个数据集上执行一个 PROC FREQ(或 proc 不管你喜欢做什么),然后使用 PROC COMPARE。例如:

proc freq data=rslt1;
tables accsnnum*ibtestcd/out=rsltcounts;
run;

proc freq data=lab1;
tables accsnnum*ibtestcd/out=labcounts;
run;

proc compare base=lab1 compare=rslt1 out=compares /* options */;
by accsnnum;
run;

PROC COMPARE 有很多选项;在这种情况下,最有帮助的可能是:

  • outnoequal - 只为每行输出两个数据集中不相同的行
  • outbase 和 outcomp - 为每个 BASE 和 COMPARE 数据集输出一行(如果 OUTNOEQUAL,则仅在它们不同时)
  • outdif - 输出“差异”行,即一个减去另一个;这可能对您有帮助,也可能没有帮助

documentation 列出了所有选项。如果您的数据可能存在数值精度问题,您可能还需要查看 METHOD 选项。

【讨论】:

  • Proc 比较,虽然看起来很简单,但非常令人生畏。谢谢你的解释。
猜你喜欢
  • 1970-01-01
  • 2018-01-10
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2011-11-26
相关资源
最近更新 更多