全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
3254 5
2010-08-31
悬赏 40 个论坛币 已解决
我有一段非常优秀的code如下, 可以实现找到每个变量的missing value的百分比,大家一运行便知结果

data survey;
  input id diet exer hours xwk educ;
  datalines;
1 1 . 1 3 1
1 . 2 1 4 2
1 . 4 . . .
1 1 5 2 3 .
2 . 9 2 3 .
2 5 9 2 4 .
2 . 3 . 5 3
3 2 . . . .
;

proc sql noprint;
    select distinct name into : var_list separated by " "
      from dictionary.columns
      where  libname="WORK" and memname="SURVEY" and upcase(name) ne "ID";
quit;
%put &var_list;

%macro count_miss(ds= , byvar= , vars= );

%let i=1;
%let var1=%sysfunc(scan(&vars,1));
%do %until(&v eq );

%let i=%eval(&i+1);

    %let v=%sysfunc(scan(&vars,&i));

%let var&i=&v;
%end;
%let varnum=%eval(&i-1);

proc sql;
    create table countmiss as
    select &byvar

%do i=1 %to &varnum;
              ,sum(missing(&&var&i)) as &&var&i.._miss

%end;

from &ds

group by &byvar;

    create table counttotal as
    select distinct &byvar, count(*) as total

from &ds

group by &byvar;


create table countmiss_pct_&ds as

select a.&byvar

%do i=1 %to &varnum;
              ,(&&var&i.._miss)/total as &&var&i.._miss_pct

%end;

from countmiss a, counttotal b

where a.&byvar=b.&byvar;
quit;

proc print data=countmiss_pct_&ds; run;
%mend;

%count_miss(ds=survey, byvar=id, vars=&var_list);




但是针对上面这个survey数据没问题,但在我实际工作中的数据却会出错。因为我的变量名字都太长,比如有个变量叫‘TOTAL_CONTROL_DOSAGE_UNITS_MISS_PCT' 在log里面就会显示下面这个样的error:

“Name 'TOTAL_CONTROL_DOSAGE_UNITS_MISS_PCT' is too long for a SAS name in this context”

因为我的变量名字都是这么长,所以想请教一下如何解决这个问题。比如把上面的data set中的变量名educ改成TOTAL_CONTROL_DOSAGE_UNITS_MISS_PCT
data survey;
  input id diet exer hours xwk TOTAL_CONTROL_DOSAGE_UNITS_MISS_PCT;
  datalines;
1 1 . 1 3 1
1 . 2 1 4 2
1 . 4 . . .
1 1 5 2 3 .
2 . 9 2 3 .
2 5 9 2 4 .
2 . 3 . 5 3
3 2 . . . .
;


在运行宏%count_miss(ds=survey, byvar=id, vars=&var_list); 就会有下面的error

ERROR: The variable named TOTAL_CONTROL_DOSAGE_UNITS_MISS_PCT contains more than 32 characters.

垦请高手如何修改我的%count_miss让程序可以解决变量名长度的问题。

最佳答案

pobel 查看完整内容

应该不是宏的问题,SAS限制变量名的长度最大为32.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2010-8-31 10:38:25
应该不是宏的问题,SAS限制变量名的长度最大为32.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-8-31 10:51:46
SAS遇到变量名长度大于32时就会报错,好像只有修改变量名使其长度在32个字符以内了。


27   data test;
28        TOTAL_CONTROL_DOSAGE_UNITS_MISS_PCT=3;
ERROR: The variable named TOTAL_CONTROL_DOSAGE_UNITS_MISS_PCT contains more than 32 characters.
29   run;

NOTE: The SAS System stopped processing this step because of errors.
WARNING: The data set WORK.TEST may be incomplete.  When this step was stopped there were 0 observations and 0 variables.
NOTE: DATA statement used (Total process time):
      real time           0.02 seconds
      cpu time            0.03 seconds
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-8-31 12:40:32
Yes. SAS variable name and dataset name have limitation.
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-8-31 15:11:19
不知这个网站的办法是否有些启发
http://ciser.cornell.edu/FAQ/SAS/variable_length.shtml
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2010-8-31 15:26:19
为什么要用那么长的变量名?
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群