Sas 如何在分组中根据观察值(行)编号删除观察值?

Sas 如何在分组中根据观察值(行)编号删除观察值?,sas,Sas,在Stata,我可以这样做: bysort group_var: drop if _n > 6 按照group\u var的规定,只保留每组的前六个观察值。如何在SAS中执行此操作 我试过: proc sort data=indata out=sorted_data; by group_var; run; data outdata; set sorted_data; by group_var; if (_n_ > 6) then delete; r

在Stata,我可以这样做:

bysort group_var: drop if _n > 6
按照
group\u var
的规定,只保留每组的前六个观察值。如何在SAS中执行此操作

我试过:

proc sort data=indata out=sorted_data;
    by group_var;
run;

data outdata;
    set sorted_data;
    by group_var;
    if (_n_ > 6) then delete;
run;

但这会删除整个数据集中除前六个观测值以外的所有观测值(我总共只有六个观测值)

您需要按组统计每个组中的记录

data outdata;
   set sorted_data;
   by group_var;
   retain count;

   if first.group_var then
      count = 0;

   count = count + 1;
   if count > 6 then delete;

   drop count;
run;

当然可以使用
count+1保存一行@Joe,100%同意。对于一个新的SAS编码器来说,这有点不言自明。一、 我个人倾向于这样做,因为我知道其他人必须阅读我的代码,而且不是每个人都精通SAS.Hmm。我倾向于考虑<代码>计数+ 1;<“代码>足够基本,任何人都应该理解它,但我想这可能并不总是正确的。@Joe作为SAS的新手(但不是编程新手),我发现
count+1相当模糊,因为在其他语言中,我希望这样的语句没有效果,因为它的结果没有赋值给任何东西,而且它不一定是跨语言的惯用语句,比如递增/递减运算符。哦,在这样的回答中,我肯定会解释它(因为我已经解释了几十次)。这更多的是针对Dom关于在他自己的(工作)代码中不使用它的评论。