2012-06-06 84 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.))=.;