sas function if first.value



我有一个带有时间戳和id的数据集。每个id有几个时间戳值。有时时间是相同的,有时是不同的。我按id和时间戳排序数据。然后我把它传递给函数if first。value。然后我执行一个进程频率,对记录进行计数,每次进程频率都会给我一些id的稍微不同的计数。总的总数不会改变,但有些值被移动了,所以例如,对于id,计数是a=125和id b=130。如果我再次运行代码,值将是id a=126和id b=129。总数保持不变,但值略有变化。我用和第一个相同的变量排序。价值函数。我还尝试了过程排序nodupkey,并使用等号和no等号作为选项。是否有其他方法可以只保留每个id最早的记录?谢谢。

proc sort data=a out=b ; 
by id time ; 
run; 
data c; 
set b; 
IF FIRST.id; 
BY id time; 
run;

发布的代码应该可以正常工作。但是每个ID值只有一个观测值。因此,如果你看到129条ID='a'的观察结果,那么你已经做了一些与你发布的不同的事情。

因此,让我们使用SASHELP.CLASS作为所有SAS用户可用的示例数据集。我们将AGE作为id变量,NAME作为id中的订单变量。因此,这两个步骤将创建一个表,每个年龄的第一个人。

proc sort data=sashelp.class out=one ;
  by age name ;
run;
data want ;
 set one;
 by age;
 if first.age;
run;

如果您运行PROC FREQ或PRINT,您将看到每个AGE值只有一条记录。

proc freq data=want;
  tables age;
run;
proc print data=want;
  var age name;
run;

如果您在输出中获得ID和DATE以外的变量的不同值,那么这意味着您的输入具有相同ID和DATE值的重复记录。要让它始终选择相同的值,您可以尝试使用EQUALS选项使其保持相对顺序。但是,如果您的输入来自数据库,那么它可能不支持。您可以查找其他关键变量来添加到SORT上的BY语句中。你也可以尝试对所有的变量进行排序。

proc sort data=have out=want ;
  by id date _all_ ;
run;
data want;
   set want;
   by id;
   if first.id;
run;

这应该可以工作,您确实需要排序两次。

proc sort data=a out=b; 
by id time ; 
run; 
proc sort data=b nodupkey;
by id;
run;

NOEQUALS不维护输出的顺序,这在本例中很重要。

= | NOEQUALS指定输出数据集中观测值的顺序。对于具有相同by变量值的观测值,EQUALS在输出数据集中维护输入数据集中观测值的相对顺序。NOEQUALS不一定在输出数据集中保持这个顺序。

相关内容

最新更新