我想创建一个名为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
答案 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.;