在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
)。
我想创建一个离散变量,它将变量 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
)。