我有一个带有时间戳和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不一定在输出数据集中保持这个顺序。