2012-06-06 55 views
0

我有10年的数据,需要计算其中variable =的数量。和其中变量的数量= 1的一些变量。每年都有一些共同的变数和一些不同的变量。以下代码在处有问题,其中声明。 这里是错误信息,在此先感谢您的帮助。宏变量在哪里陈述

* ERROR 22-322:语法错误,需要下列之一:名称,引用字符串,数字常量,日期时间常数, 缺失值,(,,+, - ,ALL ,ANY,BTRIM,计算CASE,INPUT,PUT,选择,一些子串,翻译, USER

这里是所有数据集:

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

pleast使用选项MPRINT阀芯得到完整的错误消息。 – Shuguang

回答

0

要解决这个问题需要做的第一件事就是删除所有的宏代码。然后让代码使用文字。重复代码来模拟宏代码将执行的操作。一旦你有一个工作解决方案,把宏代码一块一块地放回去。使用%PUT语句来确保宏变量正确解析。

如果您需要进一步的帮助,后期足够的样本数据,让别人来运行代码,看看错误...张贴我不认为这是可能

0

如果你的程序是完全一样的发布,问题可能是这种说法:

**where %scan(&Cmlist., &L.)=.;** 

您可能打算注释掉该行。即便如此,在这种情况下,您仍然缺少一个分号来结束您的SELECT语句; “退出”一词;将作为SELECT的一部分执行。

+0

对不起,where语句不是命令输出。只需要突出显示这里是正确的代码:{where%scan(&Cmlist。,&L.)=.;}。实际上,错误消息来自于这个**,其中**语句。 – user1238178

0

使用

%unquote(where %scan(&Cmlist., &L.))=.;