SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 1623|回复: 10
打印 上一主题 下一主题

急:请教:如何在两条记录之间重复添加上一条记录?

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-6-15 14:31:32 | 只看该作者

急:请教:如何在两条记录之间重复添加上一条记录?

请教各位大侠:
如何在两条记录之间重复添加上一条记录,添加的次数等于下一条记录对应的xx值,
比如,obs=1时,xx=19,obs=2时,xx=10,表示在obs=1和obs=2之间将obs=1的记录重复10次。依次类推。
请不吝赐教,多谢!
回复 支持 反对

使用道具 举报

0

主题

0

帖子

2

积分

新手上路

Rank: 1

积分
2
沙发
发表于 2009-6-15 16:06:32 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-6-15 21:12:43 | 只看该作者

Re: 急:请教:如何在两条记录之间重复添加上一条记录?

楼主:代码已经在论坛内消息给你,请注意查收!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-6-15 21:55:50 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-6-16 17:40:54 | 只看该作者

Re: 急:请教:如何在两条记录之间重复添加上一条记录?

楼上的程序有问题,只是对自己的行重复了相应的次数,并不符合楼主的要求。。。。。。。。。。。。。。。。。。。。。。。。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-6-16 19:11:13 | 只看该作者

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;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2009-6-16 21:41:58 | 只看该作者

Re: 急:请教:如何在两条记录之间重复添加上一条记录?

谢谢高手们的指点啊,不胜感激!
尤其是vicky1020,中间这段宏编的太巧了,真是高人哪,一开始我还不明白为什么要添麻烦编一段宏呢,后来才发现最后只要再次调用就可以解决排序问题,回复原本数据集的顺序,真是高手!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
8#
 楼主| 发表于 2009-6-16 23:04:59 | 只看该作者

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.....这位仁兄的程序对多于一个变量的数据集会有硬伤
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
9#
 楼主| 发表于 2009-6-17 20:40:33 | 只看该作者

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]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
10#
 楼主| 发表于 2009-6-17 21:38:35 | 只看该作者

Re: 急:请教:如何在两条记录之间重复添加上一条记录?

硬伤不是说你把原来的数据搞坏了,是说你重复的东西不对。你的程序只对只有一个变量的数据有效,多于一个变量的结果就不对了。
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 17:56 , Processed in 0.170380 second(s), 19 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表