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

Splitting variable into equal width intervals in SAS

我想创建一个离散变量,它将变量 x 分成 1000 个区间。我有以下内容:

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

我想要的是这样的

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

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

谢谢。

您可以使用 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 增量循环生成的数据集定义格式。

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

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 .;
  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)。