数据步骤中的多个by语句?

时间:2018-12-21 16:43:56

标签: sas

我已经找到解决问题的方法,但是我想确切地了解发生了什么,为什么,或者是否有以下解决方法:

假设您有:

data test;
   length group $20.;
   subject=1; hours=0; group= 'hour 1'; output;
   subject=1; hours=1; group= 'hour 15'; output;
   subject=1; hours=2; group= 'hour 15'; output;
   subject=2; hours=0; group= 'hour 1'; output;
   subject=2; hours=1; group= 'hour 15'; output;
   subject=2; hours=2; group= 'hour 15'; output;
run;

您要先按小时排序,然后再分组,因为它是字符,否则无法正确排序。

proc sort data=test;
   by subject hours group;
run;

现在,当您运行此代码以仅检索每个组的第一条记录时:

data test2;
   set test;
   by subject hours group;
   if first.group;
run;

它将打印每条记录。

我最近了解到,“当您在BY语句中使用多个变量时;如果链接到主要BY变量的第一个/最后一个变量更改为1,则链接到第二个BY变量的第一个/最后一个变量也将更改为一个。 因此,当然,因为小时变量发生了变化,所以组中的第一个/最后一个也会被重置。

那么“为什么”这段代码运行良好?

data test2;
   set test;
   by subject group;
   if first.group;
run;

似乎不得不将排序后的变量遗漏了一点,而且看起来并不那么灵活,例如,您不能在数据步骤中使用宏变量列表作为输入来排序和按语句进行排序...?如果这只是它的方式,那么是否存在另一种首选的方式来执行此类操作?我可以看到自己经常犯此错误,只需复制粘贴排序变量列表即可。

1 个答案:

答案 0 :(得分:1)

如果要使用BY语句生成FIRST。和最后。对于未实际排序的分组变量,请在BY语句上使用NOTSORTED关键字。

例如,您可能希望按小时对数据进行排序,然后按状态将其分组,以便找出它们转换到该状态的时间。

data have;
  input subject hour status $;
cards;
 1  0   C
 1  1   B
 1  2   B
 1  3   D
 2  0   A
 2  1   D
 2  2   D
;

data want ;
  set have ;
  by subject status notsorted;
  if first.status;
run;

结果:

Obs    subject    hour    status

 1        1         0       C
 2        1         1       B
 3        1         3       D
 4        2         0       A
 5        2         1       D