全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
6755 7
2010-08-28
悬赏 50 个论坛币 已解决
现在有一个data set,如下:


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 . . . .
;

我有一个macro可以自动count给定列的每个id的missing value个数,但只能够给出一列。如果我想要写一个macro,运行一次自动给出多列,比如此列中diet exer educ的missing
value该怎么改呢,是否该用array?(实际我要用的data set 有300 多个变量需要测missing value)


options nodate pageno=1 linesize=80 pagesize=60;

%macro countm(col);
     count(case
            when &col~= .  then "count me"
            end) as Non_Missing_&col,
      count(case
            when &col=.  then "count me"
            end) as Missing_&col
%mend;


%macro countby(col);
proc sql;
    create table count_missing_&col as
    select id, %countm(&col), count(*) as total_&col
    from survey
    group by id;
quit;
%mend;

%countby(educ);

最佳答案

pobel 查看完整内容

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 . . . . ; %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; % ...
二维码

扫码加我 拉你入群

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

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

全部回复
2010-8-28 09:10:34
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 . . . .
;

%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 distinct &byvar
       %do i=1 %to &varnum;
              ,sum(missing(&&var&i)) as &&var&i.._miss
    %end;
         from &ds
   group by &byvar;
quit;
%mend;
%count_miss(ds=survey
           ,byvar=id
           ,vars=diet exer hours xwk educ)
二维码

扫码加我 拉你入群

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

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

2010-8-28 09:27:55
复制代码
二维码

扫码加我 拉你入群

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

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

2010-8-28 09:52:08
hopewell 发表于 2010-8-28 09:27
复制代码
偶在SAS9.1.3 上运行了一下您的程序,CMISS这个函数系统不认识,如果将此程序语句改为:total_miss=nmiss(diet,exer,hours,xwk,educ);则可正常通过,下面是运行的结果:


                    The SAS System      
                                                                           total_
Obs    id     diet    exer    hours    xwk    educ     miss
1          1       1        .           1           3      1         1
2          1      .          2          1           4      2         1
3          1      .          4          .                               4
4          1      1         5          2            3                1
5          2      .          9          2            3                2
6          2      5         9          2            4                1
7          2      .          3          .             5      3        2
8          3      2          .          .                               4



二维码

扫码加我 拉你入群

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

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

2010-8-28 10:25:30
The CMISS function does not convert any argument. The NMISS function converts all arguments to numeric values.
二维码

扫码加我 拉你入群

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

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

2010-8-28 10:25:34
4# rdzr

CMISS是SAS9.2新增加的函数
http://support.sas.com/kb/36/480.html
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

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