楼主: zgwshmily
6830 7

[原创博文] 请教如何用SAS计算多个变量的missing value? [推广有奖]

  • 0关注
  • 1粉丝

已卖:408份资源

大专生

28%

还不是VIP/贵宾

-

威望
0
论坛币
2169 个
通用积分
1.0200
学术水平
1 点
热心指数
1 点
信用等级
1 点
经验
287 点
帖子
25
精华
0
在线时间
20 小时
注册时间
2010-8-28
最后登录
2013-2-25

楼主
zgwshmily 发表于 2010-8-28 09:10:33 |AI写论文
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; % ...
关键词:missing value Miss 多个变量 SSIN survey count 如何

本帖被以下文库推荐

沙发
pobel 在职认证  发表于 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)
和谐拯救危机

藤椅
hopewell 发表于 2010-8-28 09:27:55
  1. data survey;
  2.     input id diet exer hours xwk $ educ $;
  3.     total_miss=nmiss(diet,exer,hours)+cmiss(xwk,educ);
  4. datalines;
  5. 1 1 . 1 3 1
  6. 1 . 2 1 4 2
  7. 1 . 4 . . .
  8. 1 1 5 2 3 .
  9. 2 . 9 2 3 .
  10. 2 5 9 2 4 .
  11. 2 . 3 . 5 3
  12. 3 2 . . . .
  13. ;
复制代码

板凳
rdzr 发表于 2010-8-28 09:52:08
hopewell 发表于 2010-8-28 09:27
  1. data survey;
  2.     input id diet exer hours xwk $ educ $;
  3.     total_miss=nmiss(diet,exer,hours)+cmiss(xwk,educ);
  4. datalines;
  5. 1 1 . 1 3 1
  6. 1 . 2 1 4 2
  7. 1 . 4 . . .
  8. 1 1 5 2 3 .
  9. 2 . 9 2 3 .
  10. 2 5 9 2 4 .
  11. 2 . 3 . 5 3
  12. 3 2 . . . .
  13. ;
复制代码
偶在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



报纸
crackman 发表于 2010-8-28 10:25:30
The CMISS function does not convert any argument. The NMISS function converts all arguments to numeric values.

地板
roki 在职认证  发表于 2010-8-28 10:25:34
4# rdzr

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

7
gzjb 发表于 2010-8-28 10:27:40
1# zgwshmily

simple way in data step. You can refine as you need.

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

data miscount(keep=MisNo:);
set survey nobs=totobs;
array col{6} id diet exer hours xwk educ;
array MisNo{6} (0,0,0,0,0,0);
do i=1 to 6;
   if missing(col{i}) then MisNo{i} = MisNo{i}+1;
  end;
  if _N_=totobs then output;
run;

proc print data=miscount;
  run;

8
gzjb 发表于 2010-8-28 10:34:46
data miscount(keep=MisNo: totMiss);
set survey nobs=totobs;
array col{6} id diet exer hours xwk educ;
array MisNo{6} (0,0,0,0,0,0);
do i=1 to 6;
   if missing(col{i}) then MisNo{i} = MisNo{i}+1;
  end;
  if _N_=totobs then do;
     totMiss=0;
     do j=1 to 6;
            totMiss=totMiss+MisNo{j};
          end;
     output;
         end;
run;

proc print data=miscount;
  run;

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-30 12:32