首页 > 解决方案 > 数据步骤中的多个 by 语句?

问题描述

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

假设你有:

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 变量的第一个/最后一个变量也将更改为 1。因此,当然,由于 hours 变量发生变化,组中的第一个/最后一个也被重置。

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

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

不得不省略你排序的变量似乎有点奇怪,而且它看起来不那么灵活,你不能使用宏变量列表作为输入来排序和数据步骤中的语句,例如...... ? 如果这就是它的方式,是否有另一种首选方式来进行此类操作?我可以看到自己经常犯这个错误,只需复制粘贴排序变量列表......

标签: sas

解决方案


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

例如,您可能希望按 HOUR 对数据进行排序,然后按 STATUS 对其进行分组,以便您可以了解它们在什么时间转换到该 STATUS。

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

推荐阅读