通过使用数组引用在datastep中的新变量中连接3个变量名

时间:2014-11-26 18:16:16

标签: sas

我想创建一个名为DATFL的变量,它具有以下值的最后一个观察点:

DATFL
gender/scan

以下是代码:

data mix_ ;
input id $  name $  gender $  scan $;
datalines;
1 jon   M  F
2 jill  F  L
3 james F  M
4 jonas M  M
;
run;

data mix_3; set mix_; 
length datfl datfl_ $ 50;
array m4(*) id name gender scan;
retain datfl;
 do i=1 to dim(m4);
  if index(m4(i) ,'M') then do; 
    datfl_=vname(m4(i)) ;
    if missing(datfl) then datfl=datfl_;
    else datfl=strip(datfl)||"/"||datfl_;
  end;
 end;

run;

不幸的是,我得到了“DATFL'在最后一个观察结果是性别/扫描/性别/扫描'。显然,由于我用于' DATFL'的保留声明。我最终得到了重复。在这个数据步骤结束时,我计划使用CALL SYMPUT语句将最后一个值加载到宏变量中,但在我解决问题之前我不会这样做...任何人都可以向我提供指导如何预防' DATFL'在数据集的末尾有重复值?干杯 sas_kappel

3 个答案:

答案 0 :(得分:0)

不要保留DATFL,而是保留DATFL _。

data mix_3; set mix_; 
    length datfl datfl_ $ 50;
    array m4(*) id name gender scan;
    retain datfl_;
    do i=1 to dim(m4);
        if index(m4(i) ,'M') then do; 
            datfl_=vname(m4(i)) ;
            if missing(datfl) then datfl=datfl_;
            else datfl=strip(datfl)||"/"||datfl_;
        end;
    end;
    if missing(datfl) then datfl = datfl_;

run;

答案 1 :(得分:0)

它不起作用...让我更改数据集(mix_),你可以看到RETAIN DATFLl_在这种情况下不起作用。

data mix_ ;
 input id $  name $  gender $  scan $;
 datalines;
1 jon   M  M
2 Marc  F  L
3 james F  M
4 jonas H  M
;
run;

要恢复,我想要的是将DATFL的DISTINCT值转换为宏变量。我建议的代码,对于每个记录,搜索具有字母M的变量,如果为真,则DATFL接收数组变量的变量名。如果有多个变量名称,则它们将以“/”分隔。对于下一个记录,执行相同的操作,但仅添加满足条件的变量名称和尚未保存在DATFL中的变量。目前,如果你运行我的程序,我在DATFL观察4,DATFL =性别/扫描/名称/扫描/扫描,但我想有DATFL =性别/扫描/名称,因为那些是不同的值。最后,我将编写以下代码;

if eof then CALL SYMPUT('DATFL',datfl);

sas_kappel

答案 2 :(得分:0)

您修改后的数据可让您更清楚地了解所需内容。这是一些应该给出正确结果的代码 我已经使用CALL CATX函数向DATFL添加新值,用/分隔。它首先检查字符串中是否存在相关的变量名称。

data mix_ ;
 input id $  name $  gender $  scan $;
 datalines;
1 jon   M  M
2 Marc  F  L
3 james F  M
4 jonas H  M
;
run;

data _null_;
set mix_ end=eof;
length datfl $100; /*or whatever*/
retain datfl;
array m4{*} $ id name gender scan;
do i = 1 to dim(m4);
if index(m4{i},'M') and not index(datfl,vname(m4{i})) then call catx('/',datfl,vname(m4{i}));
end;
if eof then call symput('DATFL', datfl);
run;

%put datfl = &DATFL.;