我有10年的数据,需要计算某些变量的变量=。的位置数和变量= 1 的位数。每年都有一些共同的变量和一些不同的变量。以下代码在 where 语句中存在问题。 这是错误信息,请提前感谢您的帮助。
* ERROR 22-322:语法错误,期望以下之一:名称,带引号的字符串,数字常量,日期时间常量, 缺失值,(,,+, - ,ALL,ANY,BTRIM,CALCULATED,CASE,INPUT,PUT,SELECT,SOME,SUBSTRING,TRANSLATE, USER。
这是数据集ALL:
Year N_community
2000 15339
2001 15246
2002 15142
2003 14916
2004 14500
2005 14701
2006 14732
2007 14804
2008 13651
2009 13751
以下是代码:
/* For year 2000 to 2009 and the number of "missing" */
data health_status_vars_missing;
set all;
run;
%let CmList = D_CFAIL D_CHD D_CHOLES D_DEPRSS D_HBP D_MYOCAR D_OTHHRT D_PSYCHO;
%let CmCnt = %sysfunc(countw(&CmList));
%macro countm(yr);
%do i=0 %to &yr.;
%do L=1 %to &CmCnt.;
proc sql;
create table %scan(&Cmlist., &L.)_M as
select 200&i as year, count(*) as %scan(&Cmlist., &L.)_M
from cohort0&i.
where %scan(&Cmlist., &L.)=.;
quit;
data health_status_vars_missing;
merge health_status_vars_missing(in=a) %scan(&Cmlist., &L.)_M(in=b);
by year;
if a;
run;
%end;
%end;
%mend countm;
%countm(9);
答案 0 :(得分:0)
要解决此问题,首先需要做的是删除所有宏代码。然后使代码与文字一起使用。重复代码以模拟宏代码将执行的操作。一旦你有了一个可行的解决方案,就把宏代码放回原处。使用%PUT语句确保宏变量正确解析。
如果您需要进一步的帮助,请发布足够的示例数据以允许某人运行代码并查看错误...已发布我认为不可能
答案 1 :(得分:0)
如果您的计划完全按照发布的方式发布,则问题很可能是此声明:
**where %scan(&Cmlist., &L.)=.;**
您可能打算将该行注释掉。即便如此,在这种情况下,您缺少一个分号来结束SELECT语句; “退出”;将作为SELECT的一部分执行。
答案 2 :(得分:0)
使用
%unquote(where %scan(&Cmlist., &L.))=.;