通过分组 SAS 创建新数据集

create new data set by grouping SAS

NAME  DATE
----  ---------- 
BOB   24/05/2013
BOB   12/06/2012
BOB   19/10/2011
BOB   05/02/2010
BOB   05/01/2009
CARL  15/05/2011
LOUI  15/01/2014
LOUI  15/05/2013
LOUI  15/05/2012

DATA newdata;
  SET mydata;
  count + 1;
  IF FIRST.name THEN count=1;
  BY name DESCENDING date;
run;

这里我得到了 count group wise 1,2,3 等等..如果 count> 3,我想要 name(bob 的所有 obs) 的输出。请帮助我..

最简单的方法是输出每个 ID 的最后一行(如果它大于 3),然后将该数据集合并回您的主数据集,只保留匹配项。您还可以使用 PROC FREQ 生成计数数据集并合并到该数据集。

您可以使用 DoW 循环在单个数据步中完成,但这更复杂,所以我不建议新用户这样做。

我认为这显示了 SQL 的强大功能 - 虽然有人会说因为这会在日志中生成一个注释,所以这不是一个好的做法。使用 SQL 中的 GROUP & HAVING 子句创建名称计数,然后限制为 3 个。

proc sql;
create table want as
select *
from have
group by name
having count(name)>3;
quit;

这里有几种不同的方法可以在 PROC SQL

中使用 SUBQUERIES
Data HAVE;
    Length NAME ;
    Input Name $ Date: ddmmyy10.;
    Format date ddmmyy10.;
    datalines;
BOB  24/05/2013
BOB  12/06/2012
BOB  19/10/2011
BOB  05/02/2010
BOB  05/01/2009
CARL 15/05/2011
LOUI 15/01/2014
LOUI 15/05/2013
LOUI 15/05/2012
;
Run;

在 Where 语句中使用多值子查询

    Proc sql;
        Create table WANT1 as
        Select *
        From Have
        Where Name in (Select name from have b group by b.name having count(b.name)>3);
    Quit;

在 From 子句中使用子查询

    Proc sql;
        Create table WANT2 as
        Select a.name, a.date
        From Have a Inner Join (select name, count(name) as Count from have b group by b.name having Count>3)
            On a.name=b.name
        ;
    Quit;