SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 835|回复: 6
打印 上一主题 下一主题

数据集转换问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2004-4-27 16:08:29 | 只看该作者

数据集转换问题

现知道数据集如下
A B
1 5
22 6
3 7
....

比如A的最小值为1最大值为41
那么按A数值大小等分为五组:1-8,9-16,17-24,25-32,33-41
可以生成五个新的数据集:B1,B2,B3,B4,B5 ;B1中变量A的值落在1-8,B2中变量A的值落在9-16以此类推。
问如何实现,该类数据集较多,无法每次观测A的最大最小值
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2004-4-27 17:11:55 | 只看该作者

Re: 数据集转换问题

[quote="kavid":fafc1]现知道数据集如下
A B
1 5
22 6
3 7
....

比如A的最小值为1最大值为41
那么按A数值大小等分为五组:1-8,9-16,17-24,25-32,33-41
可以生成五个新的数据集:B1,B2,B3,B4,B5 ;B1中变量A的值落在1-8,B2中变量A的值落在9-16以此类推。
问如何实现,该类数据集较多,无法每次观测A的最大最小值[/quote:fafc1]

以数据集TEM为例,下面的宏可以自动识别变量A的最大值,然后从1开始,每隔8将数据集拆分,生成数据集B1,B2,B3,B4......

/****  模拟数据集 ******/
data tem(drop=i);
do i=1 to 11;
a=i*4;
b=rannor(1)*4+1;
output;
end;
run;

/****  根据变量A对数据集进行拆分 ******/
%macro split;

proc sql noprint;
select max(a) into:max from tem;
quit;

%do i=1 %to %sysevalf(&max/8,ceil);
data b_&i;
set tem;
where a>=8*(&i-1)+1 and a<=8*&i;
run;
%end;
%mend split;

%split;
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2004-4-27 20:23:05 | 只看该作者
小猪,你为什么不考虑最小值呢?在你的基础上,改进一下
%macro split;
proc sql noprint;
  select max(a) into :i from tem;
  select min(a) into :j from tem;
run;

data d1 d2 d3 d4 d5;
  set tem;
  %let a=%eval((&i.-&j.)/5);  /*间距*/
  %do k=1 %to 5;
    if %eval(&j+%eval(%eval(&k-1)*&a))<=a<=%eval(&j+%eval(&k*&a)-1) then output d&k;
  %end;
run;
%mend;

%split
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2004-4-27 20:23:34 | 只看该作者
想问一下,用select max(a) as max from term;与into :max有何不同;另外,我想写为select max(a) into:max,min(a) into :min from term好像不能通过,不知为什么?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2004-4-27 22:50:57 | 只看该作者
[quote="gbt":6f7cf]想问一下,用select max(a) as max from term;与into :max有何不同;另外,我想写为select max(a) into:max,min(a) into :min from term好像不能通过,不知为什么?[/quote:6f7cf]

select max(a) as max from term
是在结果中建立一个名为max的变量存放max(a)的结果,这个max只能通过结果数据集或视图来访问
select max(a) into :max是建立一个宏变量max来存放max(a)的结果,可以通过宏替换的方式来访问。

写成
select max(a), min(a) into :max, :min就行了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2004-4-27 22:51:51 | 只看该作者
不过select  into :macro 有时候会损失精度
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
7#
 楼主| 发表于 2004-4-28 08:57:55 | 只看该作者
感谢gbt 和 SAS_Dream~~~~宏变量都有这个精度问题,一直都是我比较困惑的。各位是否知道如何设定宏变量的精度?我现在碰到精度不够的宏变量时,只能绕弯子,用数据集来做。无限麻烦呀~~~~~~
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-9 23:46 , Processed in 0.120618 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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