通过分组 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;
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
中使用 SUBQUERIESData 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;