[英]Creating loop for proc freq in SAS
我有以下数据
DATA HAVE;
input yr_2001 yr_2002 yr_2003 area;
cards;
1 1 1 3
0 1 0 4
0 0 1 3
1 0 1 6
0 0 1 4
;
run;
我想对变量 yr_2001 到 yr_2003 执行以下 proc freq。
proc freq data=have;
table yr_2001*area;
where yr_2001=1;
run;
有没有一种方法可以做到这一点而不必每年重复一次,可能是对 proc freq 使用循环?
两种方式:
1.转置
向您的数据添加一个计数器变量n
,并将其转置n area,
然后仅保留 year 标志等于 1 的值。因为我们在转置组year
上设置了索引,所以我们不需要重新排序它在进行分组处理之前。
data have2;
set have;
n = _N_;
run;
proc transpose data=have
name=year
out=have2_tpose(rename = (COL1 = year_flag)
where = (year_flag = 1)
index = (year)
drop = n
);
by n area;
var yr_:;
run;
proc freq data=have2_tpose;
by year;
table area;
run;
2.宏循环
由于它们都以yr_
,因此很容易从dictionary.columns
中获取所有变量名并遍历所有变量。 我们将使用 SQL 将名称读入|
- 分隔列表并循环遍历该列表。
proc sql noprint;
select name
, count(*)
into :varnames separated by '|'
, :nVarnames
from dictionary.columns
where memname = 'HAVE'
AND libname = 'WORK'
AND name LIKE "yr_%"
;
quit;
/* Take a look at the variable names we found */
%put &varnames.;
/* Loop over all words in &varnames */
%macro freqLoop;
%do i = 1 %to &nVarnames.;
%let varname = %scan(&varnames., &i., |);
title "&varname.";
proc freq data=have;
where &varname. = 1;
table &varname.*area;
run;
title;
%end;
%mend;
%freqLoop;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.