在SAS中将变量拆分为相等的宽度间隔

时间:2015-01-07 12:26:35

标签: sas

我想创建一个离散变量,它将变量x除以1000的间隔。我所拥有的是以下内容:

DATA have; 
   INPUT x; 
   DATALINES; 
1200
3200
5300
49 
6500
;
RUN;

我想要的是这样的东西

data want;
input x y $5-14;
DATALINES; 
1200 1000-2000
3200 3000-4000
5300 5000-6000
0049 0000-1000
6500 6000-7000
; 
RUN;

我当然可以使用if else语句编写一个数据步骤来定义区间,但是我有100个这样的区间,所以这将是非常耗时的。

感谢。

2 个答案:

答案 0 :(得分:6)

您可以使用round()函数,舍入到最接近的1000,但首先应用500的偏移量。这会给你上限。然后减去1000得到下限。

data have ;
  input x ;
  upper = round(x+500,1000) ;
  lower = sum(upper,-1000) ;
  y = catx('-',put(lower,z4.),put(upper,z4.)) ;
datalines ;
1200
3200
5300
49
6500
;
run ;
   x    upper    lower        y

1200     2000     1000    1000-2000
3200     4000     3000    3000-4000
5300     6000     5000    5000-6000
  49     1000        0    0000-1000
6500     7000     6000    6000-7000

另一种方法是根据使用循环以1000增量生成的数据集来定义格式。

答案 1 :(得分:1)

我首选的方法是使用格式,因为它允许您根据存储桶进行分析(例如PROC FREQ),但保留原始值而不使用两个不同的变量。这基本上是对Chris J的答案中最后一句话的推断。这是'代码'版本:

proc format;
  value bucket1k
    0-<1000 = '< 1k'
    1000-<2000 = '1k-<2k'
    2000-<3000 = '2k-<3k'
;
quit;

要为100个存储桶创建此格式,您可以执行以下操作:

data for_fmt;
  retain eexcl 'Y' 
         fmtname 'bucket1k';
  format label $50.;
  do start = 0 to 99000 by 1000;
    end = start+1000;
    label = catx(' ',start,'to',end);
    output;
  end;
  if start > 99000 then do;
    hlo='o';
    start=.;
    label='MISSING';
    output;
  end;
run;

proc format cntlin=for_fmt;
quit;

然后,您可以在需要它的任何分析中使用此格式(或将其应用于数据步骤中的数据集或PROC DATASETS)。