Sas 数据步骤中的多个by语句?
我已经找到了问题的解决方案,但我想知道到底发生了什么,原因是什么,或者是否有解决以下问题的方法: 假设你有:Sas 数据步骤中的多个by语句?,sas,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; ho
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。“。
因此,当然,由于小时变量发生变化,组的第一个/最后一个也会重置
那么“为什么”这段代码运行良好
data test2;
set test;
by subject group;
if first.group;
run;
必须省略已排序的变量似乎有点奇怪,而且它似乎没有那么灵活,您不能使用宏变量列表作为输入在数据步骤中进行排序和按语句排序,例如。。。?如果这只是一种方式,是否还有其他更可取的方式进行此类操作?我可以看到我自己经常犯这种错误,只要复制粘贴排序变量列表…如果您想使用BY语句首先生成。最后。对于未实际排序的分组变量,则在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
您的数据创建不正确,您是否先解决了这个问题?这是一个很好的参考,其中的图片显示了一个分组是如何工作的。你认为他们是独立的,但他们不是。它现在是一个嵌套组。我很困惑。你说你的最后一步跑得很好。你查过日志了吗?当我运行代码时,我得到了一个错误,因为数据集没有按主题组排序:错误:按变量在数据集WORK.TEST上没有正确排序。很抱歉,我稍微更改了脚本以在此处发布,我忘了在数据步骤中指定length语句,因此BY语句不会首先检查数据是否正确排序,但如果它碰巧遇到一条顺序不正确的记录,它会抱怨。因此,在本例中,数据的顺序恰好相同,因此它可以工作,但如果不是,则不会。这对你来说是一个幸运的巧合。