SAS有条件地返回标头

时间:2018-05-27 14:15:05

标签: loops header sas

我的数据集如下所示:

Data set

并希望获得如下所示的结果: desired result

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

Way1:使用proc sql

proc sql;
create table want as
select name,group1,group2,group3,
case when group1 is null then 'group1'
     when group2 is null then 'group2'
     when group3 is null then 'group3'
end as flag
from have;
quit;

Way2:使用datastep

data want;
set have;
if      group1 is null then flag = 'group1';
else if group2 is null then flag = 'group2';
else if group3 is null then flag = 'group3';
else flag = 'check';
run;

如有任何澄清,请通知我。

答案 1 :(得分:0)

如果您想避免硬编码,可以使用数组。

data have;
  infile datalines dlm=',' dsd;
  input name $ grp1 grp2 grp3;
  datalines;
    Joe,,1, 
    Moe,1,1, 
    King,1,,1
    Penn,,,1
    Zhee,1,,, 
  ;
run;

data want;
  set have;
  length flag $10;
  call missing(flag);

  array chars(3) grp1 grp2 grp3;
    do i=1 to 3;
      if chars(i)=. & flag='' then flag=catx(' ',"Group",i);
    end;
  drop i;
run;

您还可以使用VNAME(chars(i))函数调用替换代码中的CATX function调用,在这种情况下,您可以将变量名称中的grp更改为group。

答案 2 :(得分:0)

要查找变量的名称,您可以使用def fun(ret): return ret class A: def __init__(self): for string in ['a', 'b']: setattr(self, string, lambda: fun(string)) >>> a = A() >>> a.a() 'b' 功能。您可以使用数组搜索所有单独的输入标志变量,当您发现丢失的变量时,使用VNAME()来获取其名称。

VNAME()

结果:

data have;
  input name $ group1-group3 ;
cards;
Joe  . 1 .
Moe  1 1 . 
King 1 . 1
Penn . . 1
Zhee 1 . .
None 1 1 1
;

data want ;
  set have ;
  array flags group1-group3 ;
  length flag $32 ;
  do _n_=1 to dim(flags) while (missing(flag));
    if missing(flags(_n_)) then flag=vname(flags(_n_));
  end;
run;
proc print;
run;