SAS中文论坛

标题: 数据集转换问题 [打印本页]

作者: shiyiming    时间: 2004-4-27 16:08
标题: 数据集转换问题
现知道数据集如下
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的最大最小值
作者: shiyiming    时间: 2004-4-27 17:11
标题: 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;
作者: shiyiming    时间: 2004-4-27 20:23
小猪,你为什么不考虑最小值呢?在你的基础上,改进一下
%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
作者: shiyiming    时间: 2004-4-27 20:23
想问一下,用select max(a) as max from term;与into :max有何不同;另外,我想写为select max(a) into:max,min(a) into :min from term好像不能通过,不知为什么?
作者: shiyiming    时间: 2004-4-27 22:50
[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就行了。
作者: shiyiming    时间: 2004-4-27 22:51
不过select  into :macro 有时候会损失精度
作者: shiyiming    时间: 2004-4-28 08:57
感谢gbt 和 SAS_Dream~~~~宏变量都有这个精度问题,一直都是我比较困惑的。各位是否知道如何设定宏变量的精度?我现在碰到精度不够的宏变量时,只能绕弯子,用数据集来做。无限麻烦呀~~~~~~




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