楼主: playmore
4959 26

[问答] 请问如何在data步中选择性的output新的dataset [推广有奖]

11
chenys625 发表于 2013-8-16 14:41:26
webgu 发表于 2013-8-15 15:18
call execute也是我经常用的,挺好的一种处理方法。但是这里你要把原始数据集多n变,有几个不同ID就要读几遍。我下面给一个我也经常用到拼code的方法,只读一遍原数据集就可以了。
data have;
input id $ num;
datalines;
a 1
a 2
c 1
c 2
;
run;
proc sql noprint;
create table tmp as
select distinct id
from have;

select 'want_'||id into: dataname separated by ' '
from tmp;
quit;

%put &dataname.;


data Code1;
length code $100.;
code="data &dataname.; set have;";
run;
data Code2;
length code $100.;
set tmp;
if _n_=1 then code=cats('if ID="', ID, '" then output want_', ID, ';');
else code=cats('else if ID="', ID, '" then output want_', ID, ';');
keep code;
run;
data code3;
length code $100.;
code='run;';
run;

data Code;
length Code $100.;
set Code1-Code3;
file "Code.txt";
put Code $;
run;
%include "Code.txt";

好用的话,给钱加分~ 哈哈哈
已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
playmore + 1 + 1 + 1 热心帮助其他会员
webgu + 40 + 40 + 1 + 1 + 1 分析的有道理

总评分: 经验 + 40  论坛币 + 40  学术水平 + 2  热心指数 + 2  信用等级 + 2   查看全部评分

12
chenys625 发表于 2013-8-16 16:45:54
webgu 发表于 2013-8-15 15:18
为什么我发的程序要经过审核???

13
hytc0095 发表于 2013-8-31 09:42:30
webgu 发表于 2013-8-15 15:18
学习了

14
妖帝东皇 发表于 2013-8-31 18:00:18
看不懂~call……
┏━━━━━━━━━━━━━━┓
   ☞❤学而无友必然孤陋寡闻!❤
┗━━━━━━━━━━━━━━┛

15
playmore 发表于 2013-8-31 21:49:41
chenys625 发表于 2013-8-16 14:41
call execute也是我经常用的,挺好的一种处理方法。但是这里你要把原始数据集多n变,有几个不同ID就要读几 ...
多谢你的方法
只不过这种方法真是没法用
关键可读性太差,写完之后过不了几天就不明白了
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

16
gaotao0727 发表于 2013-8-31 22:49:38
webgu 发表于 2013-8-15 15:18
太帅了~学习~~
衣带渐宽终不悔,为伊消得人憔悴~~

17
chenys625 发表于 2013-9-1 12:40:45
playmore 发表于 2013-8-31 21:49
多谢你的方法
只不过这种方法真是没法用
关键可读性太差,写完之后过不了几天就不明白了
其实我那程序后面不用%include,直接call execute也可以。主要是想避免反复data set读原始数据,拼代码的处理就复杂一些了。

18
chenys625 发表于 2013-9-1 12:41:25
playmore 发表于 2013-8-31 21:49
多谢你的方法
只不过这种方法真是没法用
关键可读性太差,写完之后过不了几天就不明白了
我突然有想到一个新的思路,找时间试一下,争取晚些时候发上来。

19
chenys625 发表于 2013-9-1 14:17:35
playmore 发表于 2013-8-31 21:49
多谢你的方法
只不过这种方法真是没法用
关键可读性太差,写完之后过不了几天就不明白了
看看这个方法觉得怎么样?

data have;
         input id $ num;
         datalines;
         a 1
         a 2
         c 1
         c 2
         b 4
         ;
run;

proc sql noprint;
      create table temp as select distinct id        from have;
quit;

data b;
      set temp end=end;
      a="ID"||_n_;
      call symput(cats("ID_",_n_),strip(ID));
      call symput(cats("DataName_",_n_),cats("want_",ID));
      if end then call symput('n',_n_);
run;

%macro a;
data  %do i=1 %to &n.;
              &&DataName_&i.
        %end;
        ;
      set have;
      if ID="&ID_1." then output &DataName_1;
      %do i=2 %to &n.;
             else if ID="&&ID_&i." then output &&DataName_&i.;
      %end;
run;
%mend;
%a;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
playmore + 1 + 1 + 1 热心帮助其他会员

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

20
playmore 发表于 2013-9-2 10:10:56
chenys625 发表于 2013-9-1 14:17
看看这个方法觉得怎么样?

data have;
大侠你这回的方法看起来就明白多了
让你花时间想这个问题真是过意不去啊,呵呵

后来我的解法是先让这些子表格都output出来
然后用一个宏统一drop掉没有观测值的表格
playmore邀请您访问ChinaTeX论坛!!!进入ChinaTeX论坛

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

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