SAS中文论坛

标题: 急:请教:如何在两条记录之间重复添加上一条记录? [打印本页]

作者: shiyiming    时间: 2009-6-15 14:31
标题: 急:请教:如何在两条记录之间重复添加上一条记录?
请教各位大侠:
如何在两条记录之间重复添加上一条记录,添加的次数等于下一条记录对应的xx值,
比如,obs=1时,xx=19,obs=2时,xx=10,表示在obs=1和obs=2之间将obs=1的记录重复10次。依次类推。
请不吝赐教,多谢!
作者: Qiong    时间: 2009-6-15 16:06
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
[code:14etjibw]data d;
input a $ xx b;
cards;
a 3  100
b 5  99
c 2   45
;
run;
%macro sort(set= );
data &set;
set &set;
no=_n_;
run;
proc sort data=&set out=&set(drop=no);
by descending no;
run;
%mend sort( set= );

%sort(set=d);
data d(drop=i time);
set d;
time=lag(xx);
if _n_=1 then output;
if _n_>1 then do;
do i=1 to time+1;
output;
end;
end;
run;

%sort(set=d)[/code:14etjibw]
作者: shiyiming    时间: 2009-6-15 21:12
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
楼主:代码已经在论坛内消息给你,请注意查收!
作者: shiyiming    时间: 2009-6-15 21:55
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
主要是使用retain和循环语句。

data test;
input num;
datalines;
   2
  10
  20
;
data dest(drop=i n);
  set test;
  retain n;  /*store the value of num for last observation*/
  if _n_=1 then do;
     n=num;
     output;
    return;
end;
else do;
        do i=1 to num;
                 output;
        end;
        n=num;
end;
run;

proc print ;
run;
作者: shiyiming    时间: 2009-6-16 17:40
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
楼上的程序有问题,只是对自己的行重复了相应的次数,并不符合楼主的要求。。。。。。。。。。。。。。。。。。。。。。。。
作者: shiyiming    时间: 2009-6-16 19:11
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
不好意思啊,没有仔细检查结果。
程序修改如下。


data test;
input num;
datalines;
2
10
20
;
data dest(drop=i num);
set test end=lstob;
retain n; /*store the value of num for last observation*/
if _n_=1 then do;
n=num;
output;
return;
end;
else  do;
do i=1 to num;
output;
end;
n=num;
output;
end;
run;

proc print ;
run;
作者: shiyiming    时间: 2009-6-16 21:41
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
谢谢高手们的指点啊,不胜感激!
尤其是vicky1020,中间这段宏编的太巧了,真是高人哪,一开始我还不明白为什么要添麻烦编一段宏呢,后来才发现最后只要再次调用就可以解决排序问题,回复原本数据集的顺序,真是高手!
作者: shiyiming    时间: 2009-6-16 23:04
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
[code:w515fxmd]data ahuige;
  input x y;
  cards;
1 5
4 6
5 7
;
run;

data final(keep=x y);
  set ahuige end=end;
  if not end then
  do;
    p=_n_+1;
    set ahuige(keep=x rename=(x=rptn)) point=p;
    do i=1 to rptn+1;
    output;
    end;
  end;
  else output;
run;[/code:w515fxmd]好像l746.....这位仁兄的程序对多于一个变量的数据集会有硬伤
作者: shiyiming    时间: 2009-6-17 20:40
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
主要是利用原数据集生成新数据,原数据只读了一遍,,应该对原数据没有影响。
你的意思是??
[quote="ahuige":3hbcduq8][code:3hbcduq8]data ahuige;
  input x y;
  cards;
1 5
4 6
5 7
;
run;

data final(keep=x y);
  set ahuige end=end;
  if not end then
  do;
    p=_n_+1;
    set ahuige(keep=x rename=(x=rptn)) point=p;
    do i=1 to rptn+1;
    output;
    end;
  end;
  else output;
run;[/code:3hbcduq8]好像l746.....这位仁兄的程序对多于一个变量的数据集会有硬伤[/quote:3hbcduq8]
作者: shiyiming    时间: 2009-6-17 21:38
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
硬伤不是说你把原来的数据搞坏了,是说你重复的东西不对。你的程序只对只有一个变量的数据有效,多于一个变量的结果就不对了。
作者: shiyiming    时间: 2009-6-17 22:00
标题: Re: 急:请教:如何在两条记录之间重复添加上一条记录?
呵呵,明白了。变量多的话,可能就会比较麻烦。




欢迎光临 SAS中文论坛 (https://mysas.net/forum/) Powered by Discuz! X3.2