我想创建一个离散变量,它将变量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个这样的区间,所以这将是非常耗时的。
感谢。
答案 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
)。